Zobacz następujący prosty przykład rzucania:Coś o dziedziczeniu/rzucaniu .NET, którego nie rozumiem?
int i = 1000;
object o = (object)i; // cast
i.CompareTo(1000);
o.CompareTo(1000); // error
rozumiem dlaczego ostatnia linia generuje błąd. W przeciwieństwie do ints, obiekty nie implementują IComparable
i dlatego nie ujawniają metody CompareTo
. Następujące generuje również błąd:
string s = (string)i; // cast error
Ponieważ nie ma dziedzictwa między int i strun, casting nie będzie działać tutaj. Teraz spójrz na to:
AudioRender a = new AudioRender();
IBaseFilter b = (IBaseFilter)a; // cast
a.Run(1000); // error
b.Run(1000);
(Klasy te pochodzą z DirectShowNet library.)
ja tego nie rozumiem. Obsada nie generuje błędu i nie rzuca żadnych wyjątków w czasie wykonywania, więc zakładam, że AudioRender implementuje IBaseFilter. Jednak AudioRender nie narażać żadnej z metod IBaseFilter za wskazując, że moje założenie powyżej, jest źle ...
jeśli a
narzędzi b
, dlaczego nie a
narazić metod b
?
Inaczej, jeśli a
nie implementuje b
, dlaczego można odlać a
na b
?
Czy mogę odtworzyć to zachowanie bez użycia DirectShowNet?
Nawet jeśli tak, to w jaki sposób to robi Odpowiedz na pytanie? – Oded
, ponieważ pozwoliłoby to rzutować na inny typ bez tego, że jest to typ bazowy. –
Oczywiście, ale nie to widzi OP. OP otrzymuje błąd, bez którego nie rzucają. To, co powiedziałeś, nie wymaga wcale rzucania. – Oded