用 .NET 语言编写的所有代码都编译为 MSIL,但是否有特定任务/操作只能直接使用 MSIL 执行?
让我们在 MSIL 中做的事情也比 C#、VB.NET、F#、j# 或任何其他 .NET 语言更容易。
到目前为止,我们有这个:
- 尾递归
- 通用协/逆变(在 C# 4 和 VB 10 中允许)
- 仅返回类型不同的重载
- 覆盖访问修饰符
- 有一个不能从 System.Object 继承的类
- 过滤的异常(在 VB 和 C# 6 中允许)
- 调用当前静态类类型的虚方法。
- 获取值类型的盒装版本的句柄。
- 做一个尝试/错误。
- 使用禁止名称。
- 为值类型定义自己的无参数构造函数。
raise
使用元素定义事件。- CLR 允许但 C# 不允许的某些转换。
- 将非
main()
方法设为.entrypoint
. - 直接使用本机
int
和本机unsigned int
类型。 - 使用瞬态指针
- MethodBodyItem 中的 emitbyte 指令
- 抛出和捕获非 System.Exception 类型
- 继承枚举(未验证)
- 您可以将字节数组视为(小 4 倍)整数数组。
- 您可以让一个字段/方法/属性/事件都具有相同的名称(未验证)。
- 您可以从它自己的 catch 块分支回到 try 块。
- 您可以访问 famandassem 访问说明符(
protected internal
是 fam或assem,但现在在 C# 7.2 和 VB 15.5 中允许) - 直接访问
<Module>
用于定义全局函数的类或模块初始化程序。 - 创建和使用基于 1 的非零边界数组
- 创建开放实例和封闭静态委托,以及 getter/setter 的委托
- 在不使用临时变量的情况下交换两个值
- 显式实现任意名称的接口,实现两个接口功能合二为一(VB可以实现)
- 声明
vtfixup
(相当于extern
C 语言) - 指定任意
modopt
或modreq