4

これが C# で許可されていないのはなぜですか? 代替テキスト http://img706.imageshack.us/img706/7360/restriction.png

本当は書けるようになりたい

alias Y<A, B> : X<A, B>, X<B, A>

ここでは実際に統一が望まれます。A = B の場合は、メソッドを 1 つだけ定義する必要があります。

4

2 に答える 2

6

真っ先に思いつくのは以下の理由です。

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 はどのようにしてあいまいさを解決できるのでしょうか? 同じ署名を持つ同じ名前のメソッドがあります。

于 2010-03-11T21:29:13.210 に答える
2

代わりに、タイプを次のように定義できます。

public interface Y<A> : X<A,A>
{
}
于 2010-03-11T21:24:02.583 に答える