可能重复: Arithmetic operator overloading for a generic class in C#
下面是我为将复数添加到重载运算符而创建的泛型类的代码。
public class Complex<T>
{
public T _a, _b;
public Complex(T i, T j)
{
_a = i;
_b = j;
}
public static Complex<T> operator +(Complex<T> i, Complex<T> j)
{
return new Complex<T>(i._a + j._a, i._b + j._b);
}
}当我处理这件事时,我发现一个错误,
Error: Operator '+' cannot be applied to operands of type 'T' and 'T'有人能建议我如何使用运算符重载泛型吗?
发布于 2012-12-24 11:33:50
问题是编译器无法知道+运算符是否可以应用于T。不幸的是,无法将T限制为C#中的数字类型。
但是,您可能可以使用动态运行时解决这个问题:
public class Complex<T> where T : struct
{
public T _a, _b;
public Complex(T i, T j)
{
_a = i;
_b = j;
}
public static Complex<T> operator +(Complex<T> i, Complex<T> j)
{
return new Complex<T>(Sum(i._a, j._a), Sum(i._b, j._b));
}
private static T Sum(T a, T b)
{
return (dynamic)a + (dynamic)b;
}
}发布于 2012-12-24 11:36:09
如果您想作弊,可以暂时将它们标记为dynamic类型,并允许运行时决定如何进行。只要您使用的T类型定义了+运算符,它就能工作。这意味着它将同时适用于数字和字符串,或者任何类型(自定义或其他类型);不确定这是否是Complex的目的。此外,如果没有+操作符可供利用,则会在运行时抛出异常;据我所知,没有办法(据我所知)对此进行编译时检查。
public class Complex<T>
{
public T _a, _b;
public Complex(T i, T j)
{
_a = i;
_b = j;
}
public static Complex<T> operator +(Complex<T> i, Complex<T> j)
{
dynamic d_i = i;
dynamic d_j = j;
return new Complex<T>(d_i._a + d_j._a, d_i._b + d_j._b);
}
}字符串的示例用法:
Complex<string> i = new Complex<string>("Hel", "Wor");
Complex<string> j = new Complex<string>("lo ", "ld!");
Complex<string> ij = i + j;
Console.WriteLine(ij._a + ij._b); //Hello World!发布于 2012-12-25 04:56:03
如上所述,可以将T约束为IConvertible,然后使用decimal类型执行所需的数学函数,如下所示:
public class Complex<T> where T : struct, IConvertible
{
public T _a, _b;
public Complex(T i, T j)
{
_a = i;
_b = j;
}
public static Complex<T> operator +(Complex<T> i, Complex<T> j)
{
return new Complex<T>(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));
}
}https://stackoverflow.com/questions/14020486
复制相似问题