当接口之间似乎没有继承关系时,为什么两个接口之间的转换可以工作?

时间:2017-04-11 19:34:20

标签: c#

我正在尝试理解其他人编写的代码。因为我不允许发布也很复杂的原始代码,所以我必须简化它

IAData a = SomeProperty;
IBData b = a as IBData;
BData ret = b.B;

其中IADataIBData是两个接口:

public interface IBData
{
    BData B { get; set; }
}

public interface IAData
{
    void Clear();
}

private IAData _aData;
public IAData SomeProperty { get { return _aData; } }

为什么a可以显式转换为b,因为IADataIBData之间似乎没有继承关系?

我错过了什么吗?如果我过分简化代码,请道歉。

感谢。

3 个答案:

答案 0 :(得分:6)

一个类可以实现多个接口

interface IA { }
interface IB { }
class C : IA, IB { }

在这种情况下,从一个界面到另一个界面的强制转换是有效的

IA a = new C();
IB b = a as IB;

答案 1 :(得分:3)

一个类可以实现两个接口,as运算符将返回转换为所需的接口,如果具体类没有实现,则返回null

答案 2 :(得分:3)

IAData a = SomeProperty使IAData成为a静态类型。但是,a dynamic 类型是一些实现IAData的类,也可能是其他一些接口。编译器可能知道也可能不知道这些接口中是否有IBData

如果IBData恰好是SomeProperty中对象类实现的接口之一,则转换将成功,b将为非null。否则,b将为null,这是代码需要测试的内容。

虽然编译器可以运行检查,看看实现IAData的任何类是否也实现了IBData并且如果转换没有成功的机会触发错误,这个检查是不切实际的,因为另一个可以在以后添加实现。这就是编译器不报告错误或警告的原因;这也是null检查或null传播应与as运算符的结果一起使用的原因。