8

IL 静的分析ツールを作成していますが、ジェネリック型パラメーターの参照方法を管理するルールを理解するのに苦労しています。

この IL を (IList<T>インターフェイスから)取得します。

.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)
}

!0の代わりにあるのはなぜ!Tですか? VMに関する限り、それらは同等であると思いますが、名前があることが保証されている場合に位置参照を使用するのは奇妙に思えます。

更新: KeyedCollection.ctor からの追加のケース:

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
4

1 に答える 1

4

Common Language Infrastructure 規格Partition II - Metadata and File Formatの 7.1 節「Types」には、次のように記載されています。

Type ::=        Description
--------        -----------
'!'             Generic parameter in a type definition, accessed by index from 0

簡単に言えば、仕様にあるからです。

長い回答: これは私の憶測ですが、基本的に、ほとんどの IL コマンドはスタックベースであり、常に位置参照をパラメーターとして使用します。とはいえ、IL で共通のパターン/使用メカニズムを維持するために、位置参照がジェネリックに使用されることは理にかなっています。

于 2012-07-13T18:49:00.143 に答える