泛型运算符'+'不能应用于'T'和'T'类型的操作数

时间:2013-02-02 19:19:00

标签: c# generics

  

可能重复:
  Solution for overloaded operator constraint in .NET generics
  Implementing arithmetic in generics?

我写了Generics类,但我遇到了标题中描述的问题。

class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;
            int c = 3;

            dynamic obj = new Gen<int>();
            obj.TestLine1(ref a, ref b);
            obj = new Gen<string>();
            obj.TestLine2(ref a, ref b, ref c);
            System.Console.WriteLine(a + " " + b);
            Console.ReadLine();
        }
    }

public class Gen<T>
    {
        public void TestLine1(ref T a, ref T b)
        {
            T temp;
            temp = a;
            a = b;
            b = temp;
        }
        public void TestLine2(ref T a, ref T b, ref T c)
        {
            T temp;
            temp = a;
            a = a + b;
            b = a + c;
            c = a + b;
        }
    }

在方法TestLine2内部(ref T a,ref T b,ref T c)我遇到问题:

Operator '+' cannot be applied to operands of type 'T' and 'T'

4 个答案:

答案 0 :(得分:6)

由于T可以是任何类型,因此无法保证T将拥有静态+运算符。在C#中,无法约束T来支持+等静态运算符,因此您必须传递该函数以将TTestLine2的值结合使用:

public void TestLine2(ref T a, ref T b, ref T c, Func<T, T, T> op)
{
    T temp;
    temp = a;
    a = op(a, b);
    b = op(a, c);
    c = op(a, b);
}

答案 1 :(得分:1)

您不知道T是否实现了+运算符。如果您将object作为类型参数传递怎么办?

答案 2 :(得分:0)

因为在实例化之前不知道T的类型,所以不能保证类型T将支持+运算符。

答案 3 :(得分:0)

假设我创建了一个类的实例:var gen = new Gen<Object>()。现在T表示此类实例中的Object无处不在。当你调用TestLine2()时,该方法将尝试添加到Objects,这是C#中无法完成的。

更广泛地说,由于C#事先不知道你要创建Gen对象的类型参数,它会限制你只使用为所有对象定义的方法。

在我看来,你真的希望TestLine2成为组合字符串的方法。为什么不让Gen成为非泛型类,并告诉它在任何地方都使用String