私はIL静的解析ツールを書いている、と私はジェネリック型パラメータが参照されている方法を規定する規則の理解に苦労抱えている:ILのジェネリックス - いつT!が使用されるかについてのルールは何ですか?
(IList<T>
interfaceから)このILを取る:
.property instance !T Item(
int32 index
)
{
.get instance !0 System.Collections.Generic.IList`1::get_Item(int32)
.set instance void System.Collections.Generic.IList`1::set_Item(int32, !0)
}
を
!T
の代わりに!0
が表示されるのはなぜですか?私はそれらがVMが行く限り同等であると推測しますが、あなたが名前を持つことが保証されているときには、位置参照を使用するのは奇妙に思えます。
更新:KeyedCollection.ctorから追加の場合、:Common Language Infrastructure standardで
IL_0037: newobj instance void class System.Collections.Generic.Dictionary`2<!TKey,!TItem>::'.ctor'(class System.Collections.Generic.IEqualityComparer`1<!0>)
IL_003c: stfld class System.Collections.Generic.Dictionary`2<!0,!1> class System.Collections.ObjectModel.KeyedCollection`2<!0,!1>::dictionary
これは表示されません。あなたは逆アセンブラのバグではないと確信していますか? –
うん、それは間違いなく、逆アセンブラ(この場合はモノラル)が生成しているものです。 Mono.Cecil(これは、より多くの書籍のメタデータに似ているようです)、例えば:stfld System.Collections.Generic.Dictionary'2 System.Collections.ObjectModel.KeyedCollection'2 ::辞書 –
toshok
@HansPassant ILを紹介するのにあなたは何を使っていますか? – casperOne