-1

可能重复:
.NET 泛型中重载运算符约束的解决方案在泛型中
实现算术?

我写了泛型类,但我遇到了标题中描述的问题。

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'
4

4 回答 4

7

由于T可以是任何类型,因此不能保证T会有静态+运算符。在 C# 中,没有办法限制T支持静态运算符,例如+,因此您必须传递函数以用于组合 to 的TTestLine2

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);
}
于 2013-02-02T19:21:29.930 回答
1

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

于 2013-02-02T19:31:53.060 回答
0

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

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

在我看来,您真的想TestLine2成为一种组成字符串的方法。为什么不创建Gen一个非泛型类并告诉它在String任何地方都使用 s 呢?

于 2013-02-02T19:31:27.147 回答
0

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

于 2013-02-02T19:21:14.623 回答