C# 类型参数统一
为什么这在C#中是不允许的? 事实上,我希望能够写作C# 类型参数统一,c#,generics,unification,C#,Generics,Unification,为什么这在C#中是不允许的? 事实上,我希望能够写作 alias Y<A, B> : X<A, B>, X<B, A> 别名Y:X,X 这里其实是要统一的,;如果A=B,则只应定义一种方法。您可以将类型定义为: public interface Y<A> : X<A,A> { } 公共接口Y:X { } 首先想到的原因如下 class Example : Y<int,int> { ... } 类示例:Y{ ...
alias Y<A, B> : X<A, B>, X<B, A>
别名Y:X,X
这里其实是要统一的,;如果A=B,则只应定义一种方法。您可以将类型定义为:
public interface Y<A> : X<A,A>
{
}
公共接口Y:X
{
}
首先想到的原因如下
class Example : Y<int,int> {
...
}
类示例:Y{
...
}
在这种情况下,类型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{
B Tx(ax){
WriteLine(“文件中的Top方法”);
返回默认值(B);
}
A Tx(bx){
WriteLine(“文件中的底部方法”);
返回默认值(A);
}
}
如果忽略统一错误,这是Y
的合法实现。现在假设用户执行了以下操作
var v1 = new OtherExample<int,int>();
v1.Tx(42);
var v1=new OtherExample();
v1.Tx(42);
在这种情况下会发生什么?编译器或CLR如何解决歧义?您将拥有具有相同签名的同名方法 -哲学是,如果你做了一个非感官的实例化,你要求它,但这比不允许一个有用的模式要好。也就是说:不要因为工具可能被滥用就扔掉它:滥用可以被静态地检查和否认。