【问题标题】:Generics Operator '+' cannot be applied to operands of type 'T' and 'T' [duplicate]泛型运算符“+”不能应用于“T”和“T”类型的操作数[重复]
【发布时间】:2013-02-02 19:18:59
【问题描述】:

可能重复:
Solution for overloaded operator constraint in .NET generics
Implementing arithmetic in 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'

【问题讨论】:

  • 这是 C# 中相当常见的问题。您不能在 T 上定义约束来指定“T 必须实现 + 运算符”
  • 你还没有将T限制为+able类型,所以编译器无法知道+可以应用于T
  • 大约 10,000 个早期问题的重复:stackoverflow.com/search?q=%5Bc%23%5D+%5Bgenerics%5D+arithmetic 寻找 Marc Gravell 写的答案,他很好地解决了这个问题

标签: c# generics


【解决方案1】:

由于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);
}

【讨论】:

    【解决方案2】:

    你不知道T 是否实现了 + 运算符。如果将object 作为类型参数传递呢?

    【讨论】:

      【解决方案3】:

      因为直到实例化才知道 T 的类型,所以不能保证类型 T 将支持 + 运算符。

      【讨论】:

      • 是的,但这只是诊断而非解决方案。
      • @Wicktor:没有问题,也没有研究工作。也许OP想要一个解释。
      【解决方案4】:

      假设我像这样创建了你的类的一个实例:var gen = new Gen&lt;Object&gt;()。现在T 意味着Object 在你的类的这个实例中的任何地方。当您调用TestLine2() 时,该方法将尝试添加到对象中,这在 C# 中是无法完成的。

      更广泛地说,由于 C# 不提前知道您将使用什么类型的参数创建 Gen 对象,因此它限制您只能使用为所有对象定义的方法。

      在我看来,您确实希望 TestLine2 成为一种组合字符串的方法。为什么不直接将Gen 设为非泛型类并告诉它在任何地方都使用Strings?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        • 2013-06-09
        • 2011-08-14
        • 1970-01-01
        • 2020-05-05
        • 2015-12-11
        相关资源
        最近更新 更多