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

Die folgende Tabelle enthält das Hexadezimal- und Microsoft MSIL-Assemblyformat (Intermediate Language) der Anweisung sowie eine kurze Referenzzusammenfassung:

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

Das constrained Präfix 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 ptrwird auf den Stapel verschoben. Der Typ von ptr muss ein verwalteter Zeiger (&) auf thisType. Beachten Sie, dass dies anders ist als bei einer unvoreingestellten callvirt Anweisung, die einen Verweis von thisType.

  2. Methodenargumente arg1argN werden auf den Stapel verschoben, genau wie bei einer nicht voreingestellten callvirt Anweisung.

Das constrained Präfix ist so konzipiert, dass callvirt Anweisungen auf einheitliche Weise erfolgen können, unabhängig davon, ob thisType es sich um einen Werttyp oder einen Bezugstyp handelt.

Wenn eine callvirtmethod Anweisung einem Präfix vorangestellt constrainedthisTypewurde, wird die Anweisung wie folgt ausgeführt:

  • Wenn thisType es sich um einen Bezugstyp (im Gegensatz zu einem Werttyp) handelt, ptr wird dieser abgeleitet und als "this"-Zeiger an den callvirt Wert methodübergeben.

  • Wenn thisType es sich um einen Werttyp handelt und thisType implementiert method wird, ptr wird der Zeiger "this" als "this"-Zeiger für callmethod die Implementierung von method by thisTypeübergeben.

  • Wenn thisType es sich um einen Werttyp handelt und thisType nicht implementiert methodptr wird, wird dieser abgeleitet, boxed und als "this"-Zeiger an die callvirtmethod Anweisung übergeben.

Dieser letzte Fall kann nur auftreten, wenn method er für Object, ValueTypeoder Enum nicht überschrieben wurde.thisType In diesem Fall bewirkt das Boxen, dass eine Kopie des ursprünglichen Objekts erstellt wird. Da jedoch keine der Methoden des ObjectObjekts , ValueTypeund Enum der Zustand des Objekts geändert wird, kann diese Tatsache nicht erkannt werden.

Das constrained Präfix 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 und ptr der aufgerufenen Methode. Wenn ptr es sich jedoch um einen generischen Typ handelt, der zur Kompilierungszeit unbekannt ist, ist es nicht möglich, diese Transformation zur Kompilierungszeit zu erstellen.

Mit dem constrained Opcode können IL-Compiler eine virtuelle Funktion auf einheitliche Weise aufrufen, unabhängig davon, ob ptr es sich um einen Werttyp oder einen Verweistyp handelt. Obwohl sie für den Fall vorgesehen ist, dass thisType es sich um eine generische Typvariable handelt, funktioniert das constrained Präfix auch für nichtgenerische Typen und kann die Komplexität des Generierens virtueller Aufrufe in Sprachen verringern, die den Unterschied zwischen Werttypen und Verweistypen ausblenden.

Durch die Verwendung des constrained Präfixes werden auch potenzielle Versionsverwaltungsprobleme mit Werttypen vermieden. Wenn das constrained Präfix nicht verwendet wird, muss je nachdem, ob ein Werttyp eine Methode von System.Object überschreibt, unterschiedliche IL-Werte ausgegeben werden. Wenn z. B. ein Werttyp V die Object.ToString()-Methode außer Kraft setzt, wird einecallV.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 constrained Präfix kann auch zum Aufrufen von Schnittstellenmethoden für Werttypen verwendet werden, da die Werttypmethode, die die Schnittstellenmethode implementiert, mithilfe einer geändert MethodImplwerden kann. Wenn das constrained Präfix nicht verwendet wird, wird der Compiler gezwungen, auszuwählen, an welche Methoden des Werttyps zur Kompilierungszeit gebunden werden sollen. Die Verwendung des constrained Präfixes 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: