在许多MSIL清单中,我观察到以下情况:
System.Nullable`1<!0> etc ...
或
class !0 etc ...
!0在这种情况下有什么意义?
!0
i86rm4rw1#
这是你用来查看.NET程序集的反编译器的怪癖。这是ildasm.exe的行为,其他的像Reflector或ILSpy就做对了。微软的程序员走了捷径,他们从IL生成了一个字符串,它只显示类型参数的编码方式,而没有编写 * 额外的 * 代码来查找元数据中的类型参数名称。您需要读取!n作为泛型类型的第n个类型参数。其中!0表示“第一个类型参数”,!1表示“第二个类型参数”,等等。对于Nullable〈〉,您从MSDN文章中知道“!0”表示“T”。您还可能遇到类似!!T的代码,两个感叹号表示泛型 method 的类型参数。ildasm.exe * 不 * 查找类型参数名称,而不是使用!!0。程序员为什么对泛型类型而不是泛型方法采取快捷方式,这很难进行反向工程。Ildasm是一个非常古怪的程序,是用C编码风格编写的,这种风格“它与. NET中的其他C代码有很大的不同。它不像实习生的作业那样有纪律性,非零的可能性:)“Nullable”后面的后缀“1”是泛型类型名的一种常规编码,它表示泛型类型有一个类型参数。换句话说,对于Nullable〈〉,你永远不会看到!1被使用。所以简单地将!0读为“T”。或者使用更好的反编译器。
!n
!!T
!!0
wnavrhmk2#
这是泛型类型参数。它们是位置性的。反编译一些泛型代码,看看它们是如何使用的(比较IL和C#)。
2条答案
按热度按时间i86rm4rw1#
这是你用来查看.NET程序集的反编译器的怪癖。这是ildasm.exe的行为,其他的像Reflector或ILSpy就做对了。微软的程序员走了捷径,他们从IL生成了一个字符串,它只显示类型参数的编码方式,而没有编写 * 额外的 * 代码来查找元数据中的类型参数名称。
您需要读取
!n
作为泛型类型的第n个类型参数。其中!0表示“第一个类型参数”,!1表示“第二个类型参数”,等等。对于Nullable〈〉,您从MSDN文章中知道“!0”表示“T”。您还可能遇到类似
!!T
的代码,两个感叹号表示泛型 method 的类型参数。ildasm.exe * 不 * 查找类型参数名称,而不是使用!!0
。程序员为什么对泛型类型而不是泛型方法采取快捷方式,这很难进行反向工程。Ildasm是一个非常古怪的程序,是用C编码风格编写的,这种风格“它与. NET中的其他C代码有很大的不同。它不像实习生的作业那样有纪律性,非零的可能性:)“Nullable”后面的后缀“1”是泛型类型名的一种常规编码,它表示泛型类型有一个类型参数。换句话说,对于Nullable〈〉,你永远不会看到!1被使用。
所以简单地将
!0
读为“T”。或者使用更好的反编译器。wnavrhmk2#
这是泛型类型参数。
它们是位置性的。
反编译一些泛型代码,看看它们是如何使用的(比较IL和C#)。