请参见以下简单的转换示例:
int i = 1000;
object o = (object)i; // cast
i.CompareTo(1000);
o.CompareTo(1000); // error
我了解为什么最后一行会产生错误。与int不同,对象不实现
IComparable
,因此不公开CompareTo
方法。以下还会产生错误:string s = (string)i; // cast error
由于int和字符串之间没有继承,因此强制转换在这里不起作用。现在,看看这个:
AudioRender a = new AudioRender();
IBaseFilter b = (IBaseFilter)a; // cast
a.Run(1000); // error
b.Run(1000);
(这些类来自DirectShowNet library。)
我不明白强制转换不会产生错误,并且在运行时不会引发任何异常,因此我假设AudioRender实现了IBaseFilter。但是,AudioRender没有公开任何IBaseFilter的方法,表明我上面的假设是错误的...
如果
a
实现b
,为什么a
不公开b
的方法?否则,如果
a
没有实现b
,为什么可以将a
强制转换为b
?此外,是否可以在不使用DirectShowNet的情况下重现此行为?
最佳答案
AudioRender可能实现Conversion Operator。
但是,查看代码后,似乎AudioRender和IBaseFilter都是Com Imports:
[ComImport, Guid("e30629d1-27e5-11ce-875d-00608cb78066")]
public class AudioRender { }
[ComImport, ("56a86895-0ad4-11ce-b03a-0020af0ba770"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IBaseFilter { .. }
如您所见,AudioRender导入类未实现IBaseFilter,因此您不会在智能感知中看到它,但是底层COM对象很可能实现了它,因此可以进行转换。