所有使用.NET语言编写的代码都会编译为MSIL,但是是否有特定任务/操作只能直接使用MSIL完成呢?
在MSIL中,我们也可以更轻松地完成一些任务,而不像C#、VB.NET、F#、j#或其他任何.NET语言那样麻烦。
到目前为止,我们有以下这些:
- 尾递归
- 泛型协变/逆变(在C#4和VB 10中允许)
- 仅返回类型不同的重载
- 覆盖访问修饰符
- 创建一个无法从System.Object继承的类
- 筛选异常(在VB和C#6中允许)
- 调用当前静态类类型的虚拟方法。
- 获取值类型的装箱版本的句柄。
- 进行try / fault操作。
- 使用被禁止的名称。
- 为值类型定义自己的无参构造函数
- 定义具有
raise
元素的事件。 - CLR允许的某些转换在C#中不允许。
- 将非
main()
方法作为.entrypoint
。 - 直接使用本机
int
和本机unsigned int
类型。 - 使用瞬态指针进行操作
- 在MethodBodyItem中使用emitbyte指令。
- 抛出和捕获非System.Exception类型。
- 继承枚举(未经验证)
- 您可以将字节数组视为(4倍较小的)整数数组。
- 一个字段/方法/属性/事件都可以拥有相同的名称(未经验证)。
- 从catch块返回到try块内部。
- 您可以使用famandassem访问修饰符(
protected internal
是famorassem,但在C# 7.2和VB 15.5中现在已允许)。
<Module>
类来定义全局函数或模块初始化器。vtfixup
(C中等同于extern
)modopt
或modreq
。