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

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

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

要么

 class !0 etc ... 

在这种情况下, !0的含义是什么?

这是您用来查看.NET程序集的反编译器的怪癖。 这是ildasm.exe的行为,其他像reflection或ILSpy得到这个权利。 编写它的微软程序员花了一个快捷方式,他从IL中生成一个string,只是显示types参数的编码方式,而不用额外的代码来查找元数据中的types参数名称。

你需要读取!n作为genericstypes的第n个types参数。 其中!0表示“第一types参数”,!1表示“第二types参数”等。 对于Nullable <>,您知道“!0”表示MSDN文章中的“T”。

你也可能遇到像!!T这样的东西。 两个感叹号表示generics方法的types参数。 这一次,ildasm.exe 查找types参数名称而不是使用!!0 。 为什么程序员采用genericstypes的快捷方式,而不是generics方法,这很难进行反向工程。 Ildasm是一个非常古怪的程序,用C ++编写的风格编写,与.NET中的其他C ++代码非常不同。 不是作为一个实习生的任务,遵守纪律,非零的可能性:)

“Nullable”上的`1后缀是genericstypes名称的普通编码,它表示genericstypes有一个types参数。 换句话说,对于Nullable <>,你永远不会看到!1被使用。

所以简单阅读!0为“T”。 或者使用更好的反编译器。

这是一个genericstypes参数。

他们是位置的。

反编译一些generics代码,看看它们是如何使用的(比较IL vs C#)。