LocalVarSig 可以有多个约束属性吗?
Can a LocalVarSig have multiple constraint attributes?
在 LocalVarSig 语法图中,CustomMod 和 Constraint 元素处于循环中,因此这意味着可以有多个 Constraint 元素。如果有多个 Constraint 元素,它的语义是什么?谢谢!
来自 ECMA-335 §II.23.2.9,添加了强调:
The Constraint item in Signatures currently has only one possible
value, ELEMENT_TYPE_PINNED (§II.23.1.16), which specifies that the
target type is pinned in the runtime heap, and will not be moved by
the actions of garbage collection.
A Constraint can only be applied within a LocalVarSig (not a
FieldSig).
所以pinned
是唯一可能的约束值,至少在当前版本的CIL中是这样。
那么,pinned
的多个实例是否有效?看起来是这样。 assembler (ILasm) 接受局部变量的多个实例:
.locals init (int32& pinned pinned pinned x)
如果我 assemble 这个然后 disassemble 它(ILdasm),生成的 IL 保留重复的 pinned
关键字。使用 MdDumper 查看程序集还会显示 StandAloneSig
table.
中重复的 0x45
字节
我没有看到多个 pinned
约束的验证差异,所以我认为它们是多余的,相当于只有一个 pinned
.
在 LocalVarSig 语法图中,CustomMod 和 Constraint 元素处于循环中,因此这意味着可以有多个 Constraint 元素。如果有多个 Constraint 元素,它的语义是什么?谢谢!
来自 ECMA-335 §II.23.2.9,添加了强调:
The Constraint item in Signatures currently has only one possible value, ELEMENT_TYPE_PINNED (§II.23.1.16), which specifies that the target type is pinned in the runtime heap, and will not be moved by the actions of garbage collection.
A Constraint can only be applied within a LocalVarSig (not a FieldSig).
所以pinned
是唯一可能的约束值,至少在当前版本的CIL中是这样。
那么,pinned
的多个实例是否有效?看起来是这样。 assembler (ILasm) 接受局部变量的多个实例:
.locals init (int32& pinned pinned pinned x)
如果我 assemble 这个然后 disassemble 它(ILdasm),生成的 IL 保留重复的 pinned
关键字。使用 MdDumper 查看程序集还会显示 StandAloneSig
table.
0x45
字节
我没有看到多个 pinned
约束的验证差异,所以我认为它们是多余的,相当于只有一个 pinned
.