可能重复:
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'
答案 0 :(得分:6)
由于T
可以是任何类型,因此无法保证T
将拥有静态+
运算符。在C#中,无法约束T
来支持+
等静态运算符,因此您必须传递该函数以将T
与TestLine2
的值结合使用:
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
?