См. следующий простой пример литья:
int i = 1000;
object o = (object)i; // cast
i.CompareTo(1000);
o.CompareTo(1000); // error
Я понимаю, почему последняя строка генерирует ошибку. В отличие от ints, объекты не реализуют IComparable
и поэтому не выставляют метод CompareTo
. Далее также генерируется ошибка:
string s = (string)i; // cast error
Так как нет наследования между ints и строками, кастинг не будет работать здесь. Теперь взгляните на это:
AudioRender a = new AudioRender();
IBaseFilter b = (IBaseFilter)a; // cast
a.Run(1000); // error
b.Run(1000);
(Эти классы взяты из библиотеки DirectShowNet.)
Я не понимаю этого. Приведение не генерирует ошибку и не исключает исключений во время выполнения, поэтому я предполагаю, что AudioRender реализует IBaseFilter. Тем не менее, AudioRender не раскрывает ни один из методов IBaseFilter, указывая, что мое предположение выше неверно...
Если a
реализует b
, почему a
не раскрывает методы b
?
Else, если a
не реализует b
, почему a
может быть отправлено на b
?
Кроме того, могу ли я воспроизвести это поведение без использования DirectShowNet?