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

本文关键字:类型 一种 MSIL Microsoft 中间语言 为什么 | 更新日期: 2023-09-27 18:03:54

在许多MSIL清单中,我观察到以下情况:

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

class !0 etc ...

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

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

这是您用来查看. net程序集的反编译器的特点。这是ildasm.exe的行为,其他的像Reflector或ILSpy得到这个正确的。编写它的微软程序员采用了一种快捷方式,他们从IL生成一个字符串,该字符串只显示类型参数的编码方式,而不需要编写额外的代码来在元数据中查找类型参数名称。

您需要读取!n作为泛型类型的第n个类型参数。其中!0表示"第一类型参数",!1表示"第二类型参数",以此类推。对于Nullable<>,您知道'!"0"表示MSDN文章中的"T"。

你也可能遇到像!!T这样的东西。两个感叹号表示泛型方法的类型参数。这一次,ildasm.exe 查找类型参数名称,而不是使用!!0。为什么程序员在泛型类型上走捷径而不是在泛型方法上走捷径是很难逆向工程的。Ildasm是一个非常古怪的程序,它是用c++编码风格编写的,与。net中的其他c++代码非常不同。没有纪律,非零概率这是实习生的任务:)

"Nullable"是泛型类型名称的普通编码,它指示泛型类型有一个类型参数。换句话说,对于Nullable<>你永远不会看到!1被使用。

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

这是一个泛型类型参数。

它们是位置的

反编译一些泛型代码,看看它们是如何使用的(比较IL和c#)。