次のように、共変型パラメーターを持つジェネリック インターフェイスがあるとします。
interface IGeneric<out T>
{
string GetName();
}
そして、このクラス階層を定義すると:
class Base {}
class Derived1 : Base{}
class Derived2 : Base{}
次に、明示的なインターフェイス実装を使用して、次のように 1 つのクラスにインターフェイスを 2 回実装できます。
class DoubleDown: IGeneric<Derived1>, IGeneric<Derived2>
{
string IGeneric<Derived1>.GetName()
{
return "Derived1";
}
string IGeneric<Derived2>.GetName()
{
return "Derived2";
}
}
(非ジェネリック)DoubleDown
クラスを使用してキャストした場合、IGeneric<Derived1>
またはIGeneric<Derived2>
期待どおりに機能する場合:
var x = new DoubleDown();
IGeneric<Derived1> id1 = x; //cast to IGeneric<Derived1>
Console.WriteLine(id1.GetName()); //Derived1
IGeneric<Derived2> id2 = x; //cast to IGeneric<Derived2>
Console.WriteLine(id2.GetName()); //Derived2
ただし、 を にキャストするx
とIGeneric<Base>
、次の結果が得られます。
IGeneric<Base> b = x;
Console.WriteLine(b.GetName()); //Derived1
呼び出しが 2 つの実装の間であいまいであるため、コンパイラがエラーを発行することを期待していましたが、最初に宣言されたインターフェイスが返されました。
なぜこれが許可されているのですか?
( 2つの異なるIObservableを実装するクラスに触発されましたか?同僚にこれが失敗することを示そうとしましたが、どういうわけか失敗しませんでした)