OpCodes.Constrained Поле
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Ограничивает тип, в котором выполняется вызов виртуального метода.
public: static initonly System::Reflection::Emit::OpCode Constrained;
public static readonly System.Reflection.Emit.OpCode Constrained;
staticval mutable Constrained : System.Reflection.Emit.OpCode
Public Shared ReadOnly Constrained As OpCode
Значение поля
Комментарии
В следующей таблице перечислены шестнадцатеричные и шестнадцатеричные и Microsoft формате сборки промежуточного языка (MSIL) инструкции, а также краткая сводка по ссылке:
| Формат | Формат сборки | Description |
|---|---|---|
FE 16 <T> |
Ограничены. thisType |
Вызов виртуального метода для типа, ограниченного типом.T |
constrained Префикс разрешен только в инструкцииcallvirt.
Состояние стека MSIL на этом этапе должно быть следующим:
Управляемый указатель
ptr, передается в стек. Типptrдолжен быть управляемым указателем (&) наthisType. Обратите внимание, что это отличается от случая нерекомендаемойcallvirtинструкции, которая ожидает ссылки наthisType.Аргументы
arg1argNметода передаются в стек так же, как и с нерекомендываемойcallvirtинструкцией.
constrained Префикс предназначен для callvirt предоставления инструкций единообразным образом независимо от того, является ли thisType тип значения или ссылочным типом.
callvirt
method Когда инструкция была префиксированаconstrainedthisType, инструкция выполняется следующим образом:
Если
thisTypeявляется ссылочным типом (в отличие от типа значения), тоptrон разыменовывается и передается в качестве указателя "this" наcallvirtтипmethod.Если
thisTypeявляется типом значения иthisTypeреализуетсяmethod, тоptrпередается неизмен как указатель "this" наcallmethodинструкцию для реализацииmethod.thisTypeЕсли
thisTypeявляется типом значения иthisTypeне реализуетсяmethodptr, то выполняется разыменовка, поле и передается в качестве указателя на инструкциюcallvirtmethod.
Этот последний случай может возникать только в том случае, если method он был определен ObjectValueTypeили Enum не переопределенthisType. В этом случае бокс приводит к тому, что копия исходного объекта будет выполнена. Однако, поскольку ни один из методов Object, ValueTypeа также Enum изменение состояния объекта, этот факт не может быть обнаружен.
Префикс constrained поддерживает генераторы IL, создающие универсальный код.
callvirt Обычно инструкция недопустима для типов значений. Вместо этого необходимо, чтобы компиляторы IL эффективно выполняли преобразование "this" , описанное выше во время компиляции, в зависимости от типа вызываемого ptr метода. Однако если ptr это универсальный тип, который неизвестен во время компиляции, это преобразование невозможно сделать во время компиляции.
Код constrained опкода позволяет компиляторам IL вызывать виртуальную функцию в однородном режиме независимо от того, является ли ptr тип значения или ссылочный тип. Хотя он предназначен для случая, когда thisType является переменной универсального типа, constrained префикс также работает для негенерических типов и может снизить сложность создания виртуальных вызовов на языках, которые скрывают различие между типами значений и ссылочными типами.
constrained Использование префикса также позволяет избежать потенциальных проблем с версиями типов значений.
constrained Если префикс не используется, необходимо создать другой IL в зависимости от того, переопределяет ли тип значения метод System.Object. Например, если тип V значения переопределяет метод Object.ToString(), callV.ToString() создается инструкция; если она не выполняется, box создается инструкция и callvirtObject.ToString() инструкция. Проблема с управление версиями может возникнуть в предыдущем случае, если переопределение будет удалено позже, и в последнем случае, если переопределение будет добавлено позже.
constrained Префикс также можно использовать для вызова методов интерфейса для типов значений, так как метод типа значения, реализующий метод интерфейса, можно изменить с помощью методаMethodImpl.
constrained Если префикс не используется, компилятор вынужден выбрать методы типа значения для привязки во время компиляции.
constrained Использование префикса позволяет MSIL привязаться к методу, который реализует метод интерфейса во время выполнения, а не во время компиляции.
Следующая Emit перегрузка метода может использовать constrained код opcode: