我正在尝试理解其他人编写的代码。因为我不允许发布也很复杂的原始代码,所以我必须简化它
IAData a = SomeProperty;
IBData b = a as IBData;
BData ret = b.B;
其中IAData
和IBData
是两个接口:
public interface IBData
{
BData B { get; set; }
}
public interface IAData
{
void Clear();
}
和
private IAData _aData;
public IAData SomeProperty { get { return _aData; } }
为什么a
可以显式转换为b
,因为IAData
和IBData
之间似乎没有继承关系?
我错过了什么吗?如果我过分简化代码,请道歉。
感谢。
答案 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
运算符的结果一起使用的原因。