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

标签 c# .net cil

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

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

class !0 etc ...

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

最佳答案

这是您用来查看 .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”。或者使用更好的反编译器。

关于c# - 为什么 !0 是 Microsoft 中间语言 (MSIL) 中的一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31559861/

相关文章:

c# - 将html字符串内容绑定(bind)到xaml中的Webview

c# - 将 DataRowCollection 转换为 NameValueCollection

.net - msil ".maxstack 1"推送超过 1 个值

c# - 如何更改没有 ID 的类 css 的属性?

.net - NHibernate:SQL 查询结果映射

c# - 简单的 Add 方法产生过多的 IL 代码

c# - 在 IL Emit 中将对象添加到循环列表 - 公共(public)语言运行时检测到无效程序

c# - 使用新标签和属性以及根自定义 XML 序列化

c# - 为什么 [Flag] 的枚举从 0 开始并递增 1?

C# 垃圾收集器复活 Null Ref 异常