私の知る限り、COMインターフェイスを扱っている場合、単純なキャストは通常QueryInterface、オブジェクトが実際に対応するCOMインターフェイスを実装しているかどうかを判断するために使用されるルーチンをトリガーします。
object whatever;
IComInterface casted = (IComInterface) whatever;
したがって、次のコードは、コンパイラと最適化に応じて、内部オブジェクト キャストの実装で をトリガーする可能性があります。QueryInterface
IComInterface comInteface;
// I guess nothing COM-related happens here, but I might be wrong
object whatever = comInteface;
// This might or might not trigger the 'QueryInterface' call.
IComInterface comInterface2 = (IComInteface) whatever;
Q:
一般的なList<T>インスタンスがあるとします:
List<IComInterface> list = new List<IComInterface>();
QueryInterfaceさて、次のコードがベースのキャストをトリガーしないという強い保証はありますか?
List<IComInterface> list = new List<IComInterface>();
IComInterface comInterface = (...); // Somehow got it.
list.Add(comInteface);
IComInterface retrieved = list[0];
ArrayListここで代わりに使用すると、型のないインスタンスからList<T>対応するものを取得する必要があるため、実際にキャストが実行されます。IComInterfaceobjectただし、ジェネリックの場合は、キャストせずにすべてを行う必要があると思いますが、実際にはそれらが表面下でどのように機能するかはわかりません。
List<T>どういうわけか型で動作する可能性はありますか(したがって、説明されているシナリオでベースobjectのキャストを呼び出します)?QueryInterface前の質問に対する答えが「いいえ」の場合、どの可能性についても同じことを保証できないというのは本当
IList<T>ですか?