请参阅以下简单的转换示例:
int i = 1000;
object o = (object)i; // cast
i.CompareTo(1000);
o.CompareTo(1000); // error
我明白为什么最后一行会产生错误。与整数不同,对象不实现IComparable
,因此不公开CompareTo
方法。以下也会产生错误:
string s = (string)i; // cast error
由于整数和字符串之间没有继承关系,因此强制转换在这里不起作用。现在,看看这个:
AudioRender a = new AudioRender();
IBaseFilter b = (IBaseFilter)a; // cast
a.Run(1000); // error
b.Run(1000);
(这些类来自DirectShowNet 库。)
我不明白这一点。强制转换不会产生错误并且在运行时不会抛出异常,所以我假设 AudioRender 实现了 IBaseFilter。但是AudioRender没有暴露任何IBaseFilter的方法,说明我上面的假设是错误的……
如果a
implements b
,为什么不a
公开 的方法b
?
否则,如果a
不执行b
,为什么会a
被强制转换为b
?
另外,我可以在不使用 DirectShowNet 的情况下重现此行为吗?