运算符重载与generics

可能重复:
C#中generics类的算术运算符重载

这是我创建的generics类的代码,用于将复数添加到重载运算符。

public class Complex { public T _a, _b; public Complex(T i, T j) { _a = i; _b = j; } public static Complex operator +(Complex i, Complex j) { return new Complex(i._a + j._a, i._b + j._b); } } 

在使用这个时,我有一个错误,

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

任何人都可以建议我使用generics运算符重载的方式?

问题是编译器无法知道+运算符是否可以应用于T 不幸的是,没有办法将T约束为C#中的数字类型。

但是,您可以使用动态运行时解决此问题:

 public class Complex where T : struct { public T _a, _b; public Complex(T i, T j) { _a = i; _b = j; } public static Complex operator +(Complex i, Complex j) { return new Complex(Sum(i._a, j._a), Sum(i._b, j._b)); } private static T Sum(T a, T b) { return (dynamic)a + (dynamic)b; } } 

如果您想作弊,可以暂时将它们标记为dynamic类型,并允许运行时确定如何执行此操作。 只要您使用的类型T定义了+运算符,它就会起作用。 这意味着它适用于数字和字符串,或任何类型(自定义或其他); 不确定这是否是你对Complex的意图。 另外,如果没有+运算符可以利用,则会在运行时抛出exception; 没有办法(我知道)为此进行编译时检查。

 public class Complex { public T _a, _b; public Complex(T i, T j) { _a = i; _b = j; } public static Complex operator +(Complex i, Complex j) { dynamic d_i = i; dynamic d_j = j; return new Complex(d_i._a + d_j._a, d_i._b + d_j._b); } } 

字符串的示例用法:

 Complex i = new Complex("Hel", "Wor"); Complex j = new Complex("lo ", "ld!"); Complex ij = i + j; Console.WriteLine(ij._a + ij._b); //Hello World! 

你不能总结两种通用对象类型; 在静态函数中,您尝试添加两个类型为T i._a和j._a。的元素,但T可以是任何类型

你想做什么?

如上所述,您可以将T约束为IConvertible ,然后使用decimal类型执行所需的数学函数,如下所示:

 public class Complex where T : struct, IConvertible { public T _a, _b; public Complex(T i, T j) { _a = i; _b = j; } public static Complex operator +(Complex i, Complex j) { return new Complex(Sum(i._a, j._a), Sum(i._b, j._b)); } private static T Sum(T a, T b) { return (T)Convert.ChangeType(a.ToDecimal(CultureInfo.CurrentCulture) + b.ToDecimal(CultureInfo.CurrentCulture), typeof(T)); } }