如果我有一个带有协变类型参数的通用接口,如下所示:
interface IGeneric<out T>
{
string GetName();
}
如果我定义这个类层次结构:
class Base {}
class Derived1 : Base{}
class Derived2 : Base{}
然后我可以在一个类上实现接口两次,就像这样,使用显式接口实现:
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
但是,将 to 强制转换x
会IGeneric<Base>
产生以下结果:
IGeneric<Base> b = x;
Console.WriteLine(b.GetName()); //Derived1
我预计编译器会发出错误,因为两个实现之间的调用不明确,但它返回了第一个声明的接口。
为什么允许这样做?
(受A 类实现两个不同的 IObservables 的启发?我试图向同事表明这会失败,但不知何故,它没有)