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 на этом этапе должно быть следующим:

  1. Управляемый указатель ptr, передается в стек. Тип ptr должен быть управляемым указателем (&) на thisType. Обратите внимание, что это отличается от случая нерекомендаемой callvirt инструкции, которая ожидает ссылки на thisType.

  2. Аргументы 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:

Применяется к