为什么C#中不允许这样做? alt text http://img706.imageshack.us/img706/7360/restriction.png
其实我希望能够写
alias Y<A, B> : X<A, B>, X<B, A>
这里实际上需要统一;如果A = B,则只应定义一种方法。
答案 0 :(得分:6)
首先想到的是以下原因。
class Example : Y<int,int> {
...
}
在这种情况下,类型Y实现两次相同的接口,但可以具有相同方法的不同实现。这在编译器中为实现和调用中的方法Tx创建了无法解决的歧义。
例如,请考虑以下问题。
class OtherExample<A,B> : Y<A,B> {
B Tx(A x) {
Console.WriteLine("Top method in the file");
return default(B);
}
A Tx(B x) {
Console.WriteLine("Bottom method in the file");
return default(A);
}
}
如果您忽略统一错误,则这是Y<A,B>
的合法实施。现在假设用户执行了以下操作
var v1 = new OtherExample<int,int>();
v1.Tx(42);
在这种情况下究竟会发生什么?编译器或CLR如何能够解决这种模糊性?您将使用具有相同签名的相同名称的方法。
答案 1 :(得分:2)
您可以将类型定义为:
public interface Y<A> : X<A,A>
{
}