Может ли LocalVarSig иметь несколько атрибутов ограничения?

В синтаксической диаграмме LocalVarSig элементы CustomMod и Constraint находятся в цикле, поэтому это означает, что может быть несколько элементов Constraint. Если существует более одного элемента ограничения, какова его семантика? Спасибо!


person tairqammar    schedule 26.09.2018    source источник


Ответы (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.

person Joe Sewell    schedule 27.09.2018