C#中泛型类的二元运算符

时间:2014-01-30 19:39:17

标签: c# generics operator-overloading

有没有办法让这段代码编译?

class Foo<T>
{
    ...
}

...

var a = new Foo<int>();
var b = new Foo<string>();
var c = a + b;

似乎C#不允许指定operator+(Foo<int> a, Foo<string> b),也不指定operator+<U>(Foo<T> a, Foo<U> b)。鉴于我可以轻松地为非通用operator +(Foo a, Bar b)Foo创建Bar,这个限制(如果存在)似乎有些奇怪。

1 个答案:

答案 0 :(得分:0)

C#中没有通用运算符支持。此外,您不能声明泛型类型限制,这意味着“此泛型类型具有一些运算符”。有办法解决这个问题。

首先使用表达式。你可以在Marc Gravells article中阅读它。

其次是使用动态。例如,通用的 Add()方法看起来可能没有例外:

public static T Add<T>(T arg1, T arg2)
{
    dynamic a1 = arg1;
    dynamic a2 = arg2;
    return a1 + a2;
}

在这两种情况下,您可能会在运行时遇到一些令人不快的意外。

但据我所知,你想添加两个不同类型的对象。的富&LT; int&gt; Foo&lt; <字符串&gt; ,我认为这甚至没有任何意义。这个添加的结果是什么?无论如何,你可以这样声明你的方法:

public static T1 Add<T1, T2>(T1 arg1, T2 arg2)
{
    dynamic a1 = arg1;
    dynamic a2 = arg2;
    return a1 + a2;
}

此方法可以成功将 int 添加到字符串(但反之亦然):

Console.WriteLine(Add("hello", 1));

您可以尝试向任何内容添加任何内容,但必须具有适当版本的运算符重载才能没有异常。另一个例子:

class MyClass<T>
{

    public static MyClass<T> operator +(MyClass<T> c1, MyClass<int> c2)
    {
        return new MyClass<T>();
    }

}

//...

// Add MyClass<string> to MyClass<int>. 
// As you can see we have appropriate version of operator overloading for doing this without exceptions.
var c1 = new MyClass<string>();
var c2 = new MyClass<int>();
var res = Add(c1, c2);