web-dev-qa-db-ja.com

なぜ!0はMicrosoft Intermediate Language(MSIL)の型なのですか?

多くのMSILリストで、次のことを確認しました。

System.Nullable`1<!0> etc ...

または

class !0 etc ...

の意味は何ですか !0これらの状況では?

86
Dragno

これは、.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」と読みます。または、より良い逆コンパイラを使用します。

114
Hans Passant

これはジェネリック型パラメーターです。

それらは定位置です。

いくつかの汎用コードを逆コンパイルして、それらの使用方法を確認します(ILとC#を比較してください)。

35
leppie