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

f4t66c6m  于 2023-03-04  发布在  .NET
关注(0)|答案(2)|浏览(118)

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

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

class !0 etc ...

!0在这种情况下有什么意义?

i86rm4rw

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”。或者使用更好的反编译器。

wnavrhmk

wnavrhmk2#

这是泛型类型参数。
它们是位置性的。
反编译一些泛型代码,看看它们是如何使用的(比较IL和C#)。

相关问题