1. ホーム
  2. c#

[解決済み] Microsoft 中間言語 (MSIL) では、なぜ !0 が型なのですか?

2023-03-19 14:04:59

疑問点

多くのMSILリストで、次のようなことが観察されます。

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

または

class !0 etc ...

の意味は何ですか? !0 はどのような意味を持つのでしょうか?

どのように解決するのですか?

これは、.NET アセンブリを参照するために使用するデコンパイラの癖です。 これは ildasm.exe の動作であり、Reflector や ILSpy のような他のものはこれを正しく実行します。 これを書いた Microsoft のプログラマーは近道をしたようで、IL から文字列を生成し、タイプ引数をエンコードされた方法で表示するだけで、その際に 余計な を書かずに、型引数の名前をメタデータで検索するための余分な なコードを書いていません。

を読み込む必要があります。 !n を一般型のn番目の型引数として読む必要がある。 ここで、!0は"第一型引数"、!1は"第二型引数"、などを意味します。 Nullable<>については、MSDNの記事で'!0`が'T'を意味することが分かっているはずです。

また、次のようなものもあります。 !!T . 2つのエクスクラメーションマークは、一般的な メソッド . 今回、ildasm.exe は が行います。 を使うのではなく、型引数の名前を調べます。 !!0 . なぜプログラマがジェネリック型ではショートカットして、ジェネリックメソッドではショートカットしないのか、リバースエンジニアリングするのは困難です。 Ildasm はかなり風変わりなプログラムで、.NET の他の C++ コードとは非常に異なる C++ コーディング スタイルで書かれています。 これはインターンの課題である可能性がゼロではないので、規律正しくありません :)

Nullable" の接尾辞 `1' は、一般的な型名に対する通常のエンコーディングで、一般的な型が 1 つの型引数を持つことを示します。 つまり、Nullable<> では !1 が使われているのを見ることはありません。

ですから、単純に !0 を "T"として読んでください。 あるいはもっと良いデコンパイラを使ってください。