C# - 为什么类 new() 约束使用 Activator.CreateInstance<T>()?

hal*_*ton 5 c# clr jit

我只是问C# - 带有 new() 约束的泛型如何生成机器代码?

考虑了一段时间后,我想知道为什么 C# 编译器会发出这样的 IL。

为什么不能说一些 IL 之类的:“调用 T 的默认构造函数”?

小智 2

CIL 中没有这样的指令(http://www.ecma-international.org/publications/standards/Ecma-335.htm)。

假设我们可以添加一个,另一种实现可能是在类型的 VTable 中,我们使默认构造函数在索引 0 处进行索引,然后 JIT 可以采用此信息并发出执行 VTable 查找的代码,选择索引 0 并调用位于 VTable 中该条目 0 所指向地址的函数。

正如您所看到的,这需要更改 CLR 数据结构,可能还需要更改每个对象的布局,并且可能需要更改值类型的不同解决方案(我忽略这种情况,因为您特别提到了 class 和 new()。