【发布时间】:2018-09-26 17:33:44
【问题描述】:
在 LocalVarSig 语法图中,CustomMod 和 Constraint 元素处于循环中,因此这意味着可以有多个 Constraint 元素。如果有多个 Constraint 元素,它的语义是什么?谢谢!
【问题讨论】:
在 LocalVarSig 语法图中,CustomMod 和 Constraint 元素处于循环中,因此这意味着可以有多个 Constraint 元素。如果有多个 Constraint 元素,它的语义是什么?谢谢!
【问题讨论】:
来自 ECMA-335 §II.23.2.9,添加了重点:
签名中的约束项目前只有一个可能 值,ELEMENT_TYPE_PINNED (§II.23.1.16),它指定 目标类型固定在运行时堆中,不会被移动 垃圾回收的动作。
约束只能在 LocalVarSig 中应用(而不是 场签名)。
所以pinned 是唯一可能的约束值,至少在当前版本的 CIL 中是这样。
那么,pinned 的多个实例是否有效?看起来是这样。汇编器 (ILasm) 接受一个局部变量的多个实例:
.locals init (int32& pinned pinned pinned x)
如果我组装它然后反汇编它(ILdasm),生成的 IL 将保留重复的 pinned 关键字。使用MdDumper 查看程序集还会显示StandAloneSig 表中重复的0x45 字节。
我没有看到多个pinned 约束的任何验证差异,所以我认为它们是多余的,相当于只有一个pinned。
【讨论】: