В синтаксической диаграмме LocalVarSig элементы CustomMod и Constraint находятся в цикле, поэтому это означает, что может быть несколько элементов Constraint. Если существует более одного элемента ограничения, какова его семантика? Спасибо!
Может ли LocalVarSig иметь несколько атрибутов ограничения?
Ответы (1)
Из ECMA-335 §II.23.2.9 добавлено выделение:
Элемент ограничения в сигнатурах в настоящее время имеет только одно возможное значение, ELEMENT_TYPE_PINNED (§II.23.1.16), который указывает, что целевой тип закреплен в динамической куче, и не будут перемещены действиями по сборке мусора.
Ограничение может применяться только в LocalVarSig (но не в FieldSig).
Таким образом, pinned
- единственное возможное значение ограничения, по крайней мере, в текущей версии CIL.
Итак, действительны ли несколько экземпляров pinned
? Похоже так. Ассемблер (ILasm) принимает несколько экземпляров локальной переменной:
.locals init (int32& pinned pinned pinned x)
Если я соберу это, а затем дизассемблирую (ILdasm), полученный IL сохранит повторяющееся ключевое слово pinned
. При просмотре сборки с помощью MdDumper также отображается повторяющийся 0x45
байт в StandAloneSig
таблице.
Я не видел никаких различий при проверке с несколькими pinned
ограничениями, поэтому предполагаю, что они избыточны и эквивалентны наличию одного pinned
.