これが C# で許可されていないのはなぜですか? 代替テキスト http://img706.imageshack.us/img706/7360/restriction.png
本当は書けるようになりたい
alias Y<A, B> : X<A, B>, X<B, A>
ここでは実際に統一が望まれます。A = B の場合は、メソッドを 1 つだけ定義する必要があります。
これが C# で許可されていないのはなぜですか? 代替テキスト http://img706.imageshack.us/img706/7360/restriction.png
本当は書けるようになりたい
alias Y<A, B> : X<A, B>, X<B, A>
ここでは実際に統一が望まれます。A = B の場合は、メソッドを 1 つだけ定義する必要があります。
真っ先に思いつくのは以下の理由です。
class Example : Y<int,int> {
...
}
この場合、タイプ Y は同じインターフェースを 2 回実装しますが、同じメソッドの異なる実装を持つことができます。これにより、実装と呼び出しの両方でメソッド 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 はどのようにしてあいまいさを解決できるのでしょうか? 同じ署名を持つ同じ名前のメソッドがあります。
代わりに、タイプを次のように定義できます。
public interface Y<A> : X<A,A>
{
}