有没有办法让这段代码编译?
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
,这个限制(如果存在)似乎有些奇怪。
答案 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);