OpCodes.Constrained Feld

Definition

Beschränkt den Typ, für den ein virtueller Methodenaufruf ausgeführt wird.

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 

Feldwert

Hinweise

In der folgenden Tabelle sind das Hexadezimal- und das MSIL-Assemblyformat (Microsoft Intermediate Language) sowie eine kurze Referenzzusammenfassung aufgeführt:

Format Assemblyformat Beschreibung
FE 16 <T> eingeschränkt. thisType Rufen Sie eine virtuelle Methode für einen Typ auf, der auf den Typ Tbeschränkt ist.

Das präfix constrained ist nur für eine callvirt Anweisung zulässig.

Der Zustand des MSIL-Stapels an diesem Punkt muss wie folgt sein:

  1. Ein verwalteter Zeiger, ptr, wird auf den Stapel verschoben. Der Typ von ptr muss ein verwalteter Zeiger (&) auf thisTypesein. Beachten Sie, dass dies anders ist als bei einer nicht voreingestellten callvirt Anweisung, die einen Verweis auf thisTypeerwartet.

  2. Methodenargumente arg1 durch argN werden genauso wie bei einer nicht voreingestellten callvirt Anweisung auf den Stapel verschoben.

Das präfix constrained ist so konzipiert, dass callvirt Anweisungen einheitlich erfolgen können, unabhängig davon, ob thisType ein Werttyp oder ein Bezugstyp ist.

Wenn eine callvirtmethod Anweisung durch constrainedthisTypevorangestellt wurde, wird die Anweisung wie folgt ausgeführt:

  • Wenn thisType ein Bezugstyp (im Gegensatz zu einem Werttyp) ist, wird ptr abgeleitet und als "this"-Zeiger an die callvirt von methodübergeben.

  • Wenn thisType ein Werttyp ist und thisTypemethod implementiert, wird ptr als "this"-Zeiger an eine callmethod Anweisung für die Implementierung von method durch thisTypeübergeben.

  • Wenn thisType ein Werttyp ist und thisTypemethod nicht implementiert, wird ptr abgeleitet, boxed und als Zeiger an die callvirtmethod Anweisung übergeben.

Dieser letzte Fall kann nur auftreten, wenn method für Object, ValueTypeoder Enum definiert und nicht durch thisTypeaußer Kraft gesetzt wurde. In diesem Fall bewirkt das Boxen, dass eine Kopie des ursprünglichen Objekts erstellt wird. Da jedoch keine der Methoden von Object, ValueTypeund Enum den Zustand des Objekts ändern, kann diese Tatsache nicht erkannt werden.

Das präfix constrained unterstützt IL-Generatoren, die generischen Code erstellen. Normalerweise ist die callvirt Anweisung für Werttypen ungültig. Stattdessen ist es erforderlich, dass IL-Compiler die oben beschriebene Transformation zur Kompilierungszeit effektiv ausführen, abhängig vom Typ der ptr und der aufgerufenen Methode. Wenn ptr jedoch ein generischer Typ ist, der zur Kompilierungszeit unbekannt ist, ist es nicht möglich, diese Transformation zur Kompilierungszeit zu erstellen.

Mit dem constrained Opcode können IL-Compiler einen Aufruf einer virtuellen Funktion auf einheitliche Weise durchführen, unabhängig davon, ob ptr ein Werttyp oder ein Verweistyp ist. Obwohl es sich bei thisType um eine generische Typvariable handelt, funktioniert das präfix constrained auch für nichtgenerische Typen und kann die Komplexität des Generierens virtueller Aufrufe in Sprachen verringern, die den Unterschied zwischen Werttypen und Referenztypen ausblenden.

Durch die Verwendung des Präfixes constrained werden auch potenzielle Versionsverwaltungsprobleme mit Werttypen vermieden. Wenn das präfix constrained nicht verwendet wird, muss je nachdem, ob ein Werttyp eine Methode von System.Object überschreibt, unterschiedliche IL ausgegeben werden. Wenn beispielsweise ein Werttyp V die Object.ToString()-Methode außer Kraft setzt, wird eine callV.ToString() Anweisung ausgegeben; andernfalls wird eine box Anweisung und eine callvirtObject.ToString() Anweisung ausgegeben. Ein Versionsverwaltungsproblem kann im früheren Fall auftreten, wenn die Außerkraftsetzung später entfernt wird, und im letzteren Fall, wenn eine Außerkraftsetzung später hinzugefügt wird.

Das präfix constrained kann auch zum Aufrufen von Schnittstellenmethoden für Werttypen verwendet werden, da die Werttypmethode, die die Schnittstellenmethode implementiert, mithilfe eines MethodImplgeändert werden kann. Wenn das präfix constrained nicht verwendet wird, wird der Compiler gezwungen, auszuwählen, an welche Methoden des Werttyps zum Kompilierungszeitpunkt gebunden werden sollen. Die Verwendung des Präfixes constrained ermöglicht dem MSIL die Bindung an die Methode, die die Schnittstellenmethode zur Laufzeit implementiert, anstatt zur Kompilierungszeit.

Die folgende Emit Methodenüberladung kann den constrained opcode verwenden:

Gilt für: