多くのMSILリストで、次のことを確認しました。
System.Nullable`1<!0> etc ...
または
class !0 etc ...
の意味は何ですか !0
これらの状況では?
これは、.NETアセンブリを見るために使用する逆コンパイラの癖です。これはildasm.exeの動作であり、ReflectorやILSpyのような他のものはこれを正しく行います。それを書いたMicrosoftプログラマーはショートカットを取り、メタデータで型引数名を検索するextraコードを記述せずに、エンコードされた方法で型引数を表示する文字列をILから生成します。
ジェネリック型のn番目の型引数として!n
を読み取る必要があります。ここで、!0は「第1タイプの引数」を意味し、!1は「第2タイプの引数」などを意味します。 Nullable <>の場合、MSDNの記事の「!0」は「T」を意味することがわかります。
!!T
のようなものに遭遇することもあります。 2つの感嘆符は、一般的なmethodの型引数を示します。今回は、ildasm.exe does!!0
を使用する代わりに、型引数名を検索します。プログラマがジェネリック型ではなくジェネリック型のショートカットを採用した理由をリバースエンジニアリングするのは困難です。 Ildasmはかなり風変わりなプログラムで、.NETの他のC++コードとは非常に異なるC++コーディングスタイルで記述されています。これがインターンの課題であるという規律のないゼロ以外のオッズ:)
「Nullable」の接尾辞「1」は、ジェネリック型名の通常のエンコードであり、ジェネリック型に1つの型引数があることを示します。つまり、Nullable <>の場合、!1が使用されていることは決してありません。
したがって、単に!0
を「T」と読みます。または、より良い逆コンパイラを使用します。
これはジェネリック型パラメーターです。
それらは定位置です。
いくつかの汎用コードを逆コンパイルして、それらの使用方法を確認します(ILとC#を比較してください)。