【问题标题】:operator overloading with generics [duplicate]使用泛型重载运算符 [重复]
【发布时间】:2012-12-10 19:48:06
【问题描述】:

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

谁能建议我如何使用泛型运算符重载?

【问题讨论】:

标签: c# generics operator-overloading


【解决方案1】:

问题是编译器无法知道+ 运算符是否可以应用于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;
    }
}

【讨论】:

  • 哇。我已经多次看到这个问题,但我从未见过这个答案。我恢复到过去发出操作码来做(dynamic) 演员似乎做的事情。很有趣。
【解决方案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!

【讨论】:

    【解决方案3】:

    如上所述,您可以将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));
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      你想做什么?

      【讨论】:

        猜你喜欢
        • 2015-05-23
        • 2017-04-28
        • 1970-01-01
        • 2018-10-19
        • 2023-03-24
        • 2016-01-25
        • 2017-06-07
        • 2010-10-21
        • 1970-01-01
        相关资源
        最近更新 更多