See the following simple casting example:
int i = 1000;
object o = (object)i; // cast
i.CompareTo(1000);
o.CompareTo(1000); // error
I understand why the last line generates an error. Unlike ints, objects don’t implement IComparable and therefore don’t expose the CompareTo method. The following also generates an error:
string s = (string)i; // cast error
Since there’s no inheritance between ints and strings, casting will not work here. Now, take a look at this:
AudioRender a = new AudioRender();
IBaseFilter b = (IBaseFilter)a; // cast
a.Run(1000); // error
b.Run(1000);
(These classes come from the DirectShowNet library.)
I don’t understand this. The cast does not generate an error and throws no exceptions at runtime, so I assume that AudioRender implements IBaseFilter. However, AudioRender does not expose any of IBaseFilter’s methods, indicating that my assumption above is wrong…
If a implements b, why doesn’t a expose the methods of b?
Else, if a does not implement b, why can a be casted to b?
Also, can I reproduce this behaviour without the use of DirectShowNet?
It is likely that AudioRender implements Conversion Operator.However, having looked at code it seems that both AudioRender and IBaseFilter are Com Imports:
As you can see AudioRender import class does not implement IBaseFilter, so you will not see it in intellisense, but it is likely that underlying COM object implements it, hence why you can cast.