私の知る限り、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>
対応するものを取得する必要があるため、実際にキャストが実行されます。IComInterface
object
ただし、ジェネリックの場合は、キャストせずにすべてを行う必要があると思いますが、実際にはそれらが表面下でどのように機能するかはわかりません。
List<T>
どういうわけか型で動作する可能性はありますか(したがって、説明されているシナリオでベースobject
のキャストを呼び出します)?QueryInterface
前の質問に対する答えが「いいえ」の場合、どの可能性についても同じことを保証できないというのは本当
IList<T>
ですか?