为什么!0是Microsoft中间语言(MSIL)中的一种类型?

Dra*_*gno 86 .net c# cil

在许多MSIL列表中,我观察到以下内容:

System.Nullable`1<!0> etc ...
Run Code Online (Sandbox Code Playgroud)

要么

class !0 etc ...
Run Code Online (Sandbox Code Playgroud)

!0在这些情况下,这意味着什么?

Han*_*ant 115

这是您用来查看.NET程序集的反编译器的怪癖.这是ildasm.exe的行为,其他像Reflector或ILSpy这样做是正确的.编写它的Microsoft程序员采用了一种快捷方式,他从IL生成一个字符串,它只是按照编码的方式显示类型参数,而无需编写额外的代码来查找元数据中的类型参数名称.

您需要读取!n泛型类型的第n个类型参数.其中!0表示"第一类型参数",!1表示"第二类型参数",等等.对于Nullable <>,您知道'!0'表示来自MSDN文章的'T'.

你可能也会遇到类似的东西!!T.两个感叹号表示泛型方法的类型参数.这次,ildasm.exe 查找类型参数名称而不是使用!!0.为什么程序员采用通用类型的快捷方式而不是通用方法的快捷方式很难进行逆向工程.Ildasm是一个非常古怪的程序,用C++编写的风格编写,与.NET中的其他C++代码截然不同.不像这是实习生的任务那样有纪律,非零的赔率:)

"Nullable"上的"1后缀"是泛型类型名称的常规编码,它表示泛型类型有一个类型参数.换句话说,对于Nullable <>你永远不会看到!1被使用.

所以简单地读!0作"T".或者使用更好的反编译器.


lep*_*pie 35

这是一个泛型类型参数.

他们是位置的.

反编译一些通用代码以查看它们的使用方式(比较IL与C#).

  • 如果我使用TryRoslyn我不明白... http://goo.gl/ZZKE38我得到`!T`和`!! T`,这取决于泛型参数是包含类还是方法. ..如果我使用ildasm也一样 (5认同)