public class MyClass
{
public static void Main()
{
test<double> tt= new test<double>();
Console.WriteLine(tt.add(1.1,2.2).ToString());

}
class test<T>
{
public test(){}
public T add(T a,T b)
{
return a+b;
}
}
}总是报错 Operator '+' cannot be applied to operands of type 'T' and 'T'用double 类型也不能相加吗??

解决方案 »

  1.   

    你可以用本文介绍的方法,如果其中一些渊源不清楚,可以参考我前边的文章
    http://ninputer.cnblogs.com/archive/2006/04/14/374921.html
      

  2.   

    你似乎完全可以把范型中的a和b转换为字符串,然后把形如"1.1+2.2"这样的字符串交给jscriptd.net的类库去计算表达式,然后再把结果返回来。但是,你应定会对这个“解决”嗤之以鼻,因为这并不是你使用范型的本意。因此,结论是,范型并不是让你含混类型的!范型是类型的函数,但是决不是对通用object的函数,而是明确的具体类型的函数。因此正如Knight94(愚翁)所说,由于不是所有类型都有+,所以你的T必须进行约束。范型是让你在使用这函数化的类型的时候仍然是强类型的,能够将类型和接口错误在编译时检查出来,而不是把遗漏“+”运算符的问题推迟到运行时。不应该把范型看成一种通向“后期绑定”的途径,否则就会白忙乎一场。
      

  3.   

    T是object,所以把他们的 ToString() 拼成一个加法表达式,然后调用那些运行时解释表达式的类库去计算出结果数值,这完全可以正常执行。用范型这个新瓶中装旧酒,虽然可以给别人炫耀你用范型做出强大的运算方法了(其实是用了机器繁琐的方法掩盖了低效率),但是经不起别人分析其实现机制并且对比其他的方法。因此,你这个问题,如果你的目的就是想证明范型可以使得a和b的类型T被含混(不需要约束它),其实是没有解答的。
      

  4.   

    @sp1234
    只能这样告诉你,你的理解是错的!
    若T可以相加,这此代码将应该得以执行。因此,需要T上约束一个“相加”概念。而不是相加接口,相加类型什么的。你不知道“概念”是什么意思,你就会觉得.NET泛型给你提供的约束功能是好东西!应该多加使用!对吗?但是不对,这不是泛型。我们需要的是“概念”而不是接口/基类/强类型和所有你能想到但不正确的东西。
      

  5.   

    在没有.NET内置“概念”约束的之前,我的方法能够做事情。
    如果最佳的做法不能做事情,你选择不做,我选择用次最佳的做法做事情。重申一遍,只要没有“概念”约束,那么接口约束/基类约束都是没用,甚至错误的做法。用这条途径得到的“强类型”与泛型格格不入。new, struct和class约束才是概念约束的例子。
      

  6.   

    恪守你那堆规则,那就试试,写一个类似List<T>的泛型容器,里面使用T[]来保存你的元素,不许约束T,然后实现一个Sort方法,进行容器排序。就这么点方法,开始写吧。不许使用System.Collections.Generic里面的任何功能写道必须违反你的规则的时候,就去看看List<T>是怎么做到的