OpCodes.Constrained Pole
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Ogranicza typ, na którym jest wykonywane wywołanie metody wirtualnej.
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
Wartość pola
Uwagi
W poniższej tabeli wymieniono format zestawu szesnastkowy i microsoft intermediate language (MSIL) instrukcji wraz z krótkim podsumowaniem referencyjnym:
Format | Format zestawu | Opis |
---|---|---|
FE 16 <T > |
Ograniczone. thisType |
Wywołaj metodę wirtualną dla typu ograniczonego do typu T . |
Prefiks constrained
jest dozwolony tylko w instrukcji callvirt
.
Stan stosu MSIL w tym momencie musi być następujący:
Zarządzany wskaźnik,
ptr
, jest wypychany do stosu. AbythisType
, typptr
musi być wskaźnikiem zarządzanym (&
). Należy pamiętać, że różni się to od przypadku nieprefiksowanej instrukcjicallvirt
, która oczekuje odwołaniathisType
.Argumenty metody
arg1
przezargN
są wypychane do stosu, podobnie jak w przypadku nieprefiksowanej instrukcjicallvirt
.
Prefiks constrained
został zaprojektowany tak, aby umożliwić wykonywanie instrukcji callvirt
w jednolity sposób niezależnie od tego, czy thisType
jest typem wartości, czy typem referencyjnym.
Gdy instrukcja callvirt
method
została poprzedzona constrained
thisType
, instrukcja jest wykonywana w następujący sposób:
Jeśli
thisType
jest typem odwołania (w przeciwieństwie do typu wartości),ptr
jest wyłuszczone i przekazywane jako wskaźnik "ten" docallvirt
method
.Jeśli
thisType
jest typem wartości ithisType
implementujemethod
,ptr
jest przekazywana niezmodyfikowana jako wskaźnik "ten" do instrukcjicall
method
w celu implementacjimethod
przezthisType
.Jeśli
thisType
jest typem wartości ithisType
nie implementujemethod
,ptr
jest wyłuszczone, w polu i przekazywane jako wskaźnik "this" do instrukcjicallvirt
method
.
Ten ostatni przypadek może wystąpić tylko wtedy, gdy method
został zdefiniowany w Object, ValueTypelub Enum i nie jest zastępowany przez thisType
. W tym przypadku boxing powoduje utworzenie kopii oryginalnego obiektu. Jednak ponieważ żadna z metod Object, ValueTypei Enum modyfikować stanu obiektu, nie można wykryć tego faktu.
Prefiks constrained
obsługuje generatory IL, które tworzą kod ogólny. Zwykle instrukcja callvirt
jest nieprawidłowa dla typów wartości. Zamiast tego wymagane jest, aby kompilatory IL skutecznie wykonywać przekształcenia "to" opisane powyżej w czasie kompilacji, w zależności od typu ptr
i wywoływanej metody. Jeśli jednak ptr
jest typem ogólnym nieznanym w czasie kompilacji, nie można wykonać tej transformacji w czasie kompilacji.
Kod constrained
umożliwia kompilatorom IL wykonywanie wywołania funkcji wirtualnej w jednolity sposób niezależnie od tego, czy ptr
jest typem wartości, czy typem odwołania. Chociaż jest przeznaczona dla sytuacji, w której thisType
jest zmienną typową, prefiks constrained
działa również dla typów niegenerycznych i może zmniejszyć złożoność generowania wywołań wirtualnych w językach, które ukrywają rozróżnienie między typami wartości i typami referencyjnymi.
Użycie prefiksu constrained
pozwala również uniknąć potencjalnych problemów z wersją typów wartości. Jeśli prefiks constrained
nie jest używany, w zależności od tego, czy typ wartości zastępuje metodę System.Object, należy emitować różne il. Jeśli na przykład typ wartości V
zastąpi metodę Object.ToString(), jest emitowana instrukcja call
V.ToString()
; jeśli tak nie jest, jest emitowana instrukcja box
i instrukcja callvirt
Object.ToString()
. Problem z przechowywaniem wersji może wystąpić w poprzednim przypadku, jeśli zastąpienie zostanie później usunięte, a w drugim przypadku, jeśli przesłonięcia zostanie później dodane.
Prefiks constrained
może być również używany do wywoływania metod interfejsu dla typów wartości, ponieważ metoda typu wartości implementuje metodę interfejsu można zmienić przy użyciu MethodImpl
. Jeśli prefiks constrained
nie jest używany, kompilator jest zmuszony do wybrania metod typu wartości, które mają być powiązane w czasie kompilacji. Użycie prefiksu constrained
umożliwia zestawowi MSIL powiązanie z metodą, która implementuje metodę interfejsu w czasie wykonywania, a nie w czasie kompilacji.
Następujące przeciążenie metody Emit może używać constrained
opcode: