15

可能重复:
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'

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

4

4 回答 4

28

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

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

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-24T11:33:50.730 回答
2

如果你想作弊,你可以暂时将它们标记为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-24T11:36:09.273 回答
1

如上所述,您可以限制TIConvertible,然后使用该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));
    }
}
于 2012-12-25T04:56:03.980 回答
0

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

你想做什么?

于 2012-12-24T11:27:32.623 回答