在许多MSIL列表中,我观察到以下情况:

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

class !0 etc ...

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

推荐答案

这是你用来查看文件的反编译器的怪癖.网络组装.这是ildasm的行为.exe,其他像Reflector或ILSpy这样的软件都能做到这一点.编写它的微软程序员采用了一种快捷方式,他从IL生成了一个字符串,该字符串只显示类型参数的编码方式,而没有编写extra代码来查找元数据中的类型参数名称.

You need to read !n as the n-th type argument of the generic type. Where !0 means "first type argument", !1 means "second type argument", etcetera. For Nullable<>, you know that '!0` means 'T' from the MSDN article.

您也可能会遇到类似于!!T的情况.两个感叹号表示泛型method的类型参数.这一次,ildasm.exe does查找类型参数名称,而不是使用!!0.为什么程序员在泛型类型上走捷径,而不是在泛型方法上走捷径,这是很难进行反向工程的.Ildasm是一个相当古怪的程序,它是用C++编码风格编写的,与.NET中的其他C++代码非常不同.这不是很有规律的,不可能是实习生的作业(job):)

The `1 suffix on "Nullable" is a normal encoding for generic type names, it indicates the generic type has one type argument. In other words, for Nullable<> you'll never see !1 being used.

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

.net相关问答推荐

跨请求共享数据

NuGet 兼容与计算框架(Xamarin 和 .NET 6)

如何查询 DOTNET_CLI_TELEMETRY_OPTOUT 是否永久设置为 TRUE?

查找 2 个已知值之间的字符串

MongoDB C# 驱动程序 - 忽略绑定字段

您是否使用 TestInitialize 或测试类构造函数来准备每个测试?为什么?

IIS Express - 500.19 无法读取配置文件 - 因为它正在查看错误的路径

运算符重载 ==, !=, Equals

C# 的 Actors 有什么好的实现吗?

是否有 Linq 方法可以将单个项目添加到 IEnumerable

风格上的差异:IDictionary vs Dictionary

C# - 你如何停止计时器?

获取磁盘上文件的大小

如何访问 Session 变量并在 javascript 中设置它们?

找不到 System.Windows.Media 命名空间?

将控制台输出镜像到文件

WPF 中的 Application.DoEvents() 在哪里?

在foreach循环中修改列表的最佳方法是什么?

如何使用 XmlSerializer 将字符串序列化为 CDATA?

无法添加对 dll 的引用