OpCodes.Constrained Feld
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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 T beschrä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:
Ein verwalteter Zeiger,
ptr
, wird auf den Stapel verschoben. Der Typ vonptr
muss ein verwalteter Zeiger (&
) aufthisType
sein. Beachten Sie, dass dies anders ist als bei einer nicht voreingestelltencallvirt
Anweisung, die einen Verweis aufthisType
erwartet.Methodenargumente
arg1
durchargN
werden genauso wie bei einer nicht voreingestelltencallvirt
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 callvirt
method
Anweisung durch constrained
thisType
vorangestellt wurde, wird die Anweisung wie folgt ausgeführt:
Wenn
thisType
ein Bezugstyp (im Gegensatz zu einem Werttyp) ist, wirdptr
abgeleitet und als "this"-Zeiger an diecallvirt
vonmethod
übergeben.Wenn
thisType
ein Werttyp ist undthisType
method
implementiert, wirdptr
als "this"-Zeiger an einecall
method
Anweisung für die Implementierung vonmethod
durchthisType
übergeben.Wenn
thisType
ein Werttyp ist undthisType
method
nicht implementiert, wirdptr
abgeleitet, boxed und als Zeiger an diecallvirt
method
Anweisung übergeben.
Dieser letzte Fall kann nur auftreten, wenn method
für Object, ValueTypeoder Enum definiert und nicht durch thisType
auß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 call
V.ToString()
Anweisung ausgegeben; andernfalls wird eine box
Anweisung und eine callvirt
Object.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 MethodImpl
geä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: