装箱系统.RuntimeArgumentHandle

问题描述 投票:0回答:1

我正在开发 MSIL 代码的解释器。当谈到装箱时,有一些已知的限制,例如,不可能对类似 byref 的结构进行装箱。

关于System.RuntimeArgumentHandle,我注意到对于.NET Framework(与.NET Core不同),System.RuntimeArgumentHandle只是一个结构体,因此似乎允许装箱。但是,下面的程序是无效的:

locals init (valuetype [mscorlib]System.RuntimeArgumentHandle V_0)

ldloca.s   V_0
initobj    [mscorlib]System.RuntimeArgumentHandle

ldloc V_0
box [mscorlib]System.RuntimeArgumentHandle
pop

此外,如果我使用旧的 Visual Studio 2008 并尝试编译以下代码,它会失败并显示错误“无法将类型‘System.RuntimeArgumentHandle’转换为‘对象’”:

var o = (object)new RuntimeArgumentHandle();

为什么不允许对 RuntimeArgumentHandle 进行装箱,编译器如何理解这一点?

.net cil
1个回答
0
投票

Boxing

System.RuntimeArgumentHandle
是规范所禁止的特殊情况。 ECMA-335,第 5 版,8.2.1.1,添加强调:

值类型 System.RuntimeArgumentHandle 和 System.ArgIterator(请参阅分区 IV 和 CIL 分区 III 中的指令 arglist),包含指向 VES 堆栈的指针。它们可用于局部变量 和参数签名。这些类型用于字段、方法返回类型、数组的元素类型或 在拳击中是不可验证(第8.8节)。这两种类型被称为类 byref 类型。

© www.soinside.com 2019 - 2024. All rights reserved.