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{ ...

为什么这在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{
...
}
在这种情况下,类型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如何解决歧义?您将拥有具有相同签名的同名方法

-哲学是,如果你做了一个非感官的实例化,你要求它,但这比不允许一个有用的模式要好。也就是说:不要因为工具可能被滥用就扔掉它:滥用可以被静态地检查和否认。