OpCodes.Constrained Pole

Definicja

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 szesnastkowy język microsoft (MSIL) 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 callvirt instrukcji.

Stan stosu MSIL w tym momencie musi być następujący:

  1. Zarządzany wskaźnik , ptrjest wypychany do stosu. Typ musi ptr być wskaźnikiem zarządzanym (&) do thisType. Należy pamiętać, że różni się to od przypadku nieprefiksowanej callvirt instrukcji, która oczekuje odwołania do thisTypeelementu .

  2. Argumenty arg1argN metody są wypychane do stosu, podobnie jak w przypadku nieprefiksowanej callvirt instrukcji.

Prefiks constrained jest zaprojektowany tak, aby umożliwić callvirt wykonywanie instrukcji w jednolity sposób niezależnie od tego, czy thisType jest typem wartości, czy typem odwołania.

callvirtmethod Gdy instrukcja została poprzedzona prefiksem constrainedthisType, 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 "this" do callvirt wartości method.

  • Jeśli thisType jest typem wartości i thisType implementuje method , ptr jest przekazywany niezmodyfikowany jako wskaźnik "this" do callmethod instrukcji, w celu implementacji method przez thisType.

  • Jeśli thisType jest typem wartości i thisType nie implementuje method , ptr zostanie wyłuszczone, w polu i przekazane jako wskaźnik "this" do callvirtmethod instrukcji.

Ten ostatni przypadek może wystąpić tylko wtedy, gdy method został zdefiniowany w Objectobiekcie , ValueTypelub, a Enum nie przesłonięć przez thisType. W tym przypadku boks powoduje utworzenie kopii oryginalnego obiektu. Jednak ze względu na to, że żadna z metod Object, ValueTypei Enum nie modyfikuje stanu obiektu, nie można wykryć tego faktu.

Prefiks constrained obsługuje generatory IL, które tworzą kod ogólny. Zwykle instrukcja jest nieprawidłowa callvirt dla typów wartości. Zamiast tego wymagane jest, aby kompilatory IL skutecznie wykonywać transformację "this" opisane powyżej w czasie kompilacji, w zależności od typu i wywoływanej ptr metody. Jednak jeśli ptr jest typem ogólnym, który jest nieznany w czasie kompilacji, nie można dokonać tej transformacji w czasie kompilacji.

Kod constrained opcode umożliwia kompilatorom IL wywołanie funkcji wirtualnej w jednolity sposób niezależnie od tego, czy ptr jest typem wartości, czy typem odwołania. Chociaż jest przeznaczona dla przypadku, gdy thisType jest zmienną typu ogólnego, constrained prefiks działa również dla typów niegeneracyjnych 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 przechowywaniem wersji z typami wartości. constrained Jeśli prefiks nie jest używany, w zależności od tego, czy typ wartości zastępuje metodę System.Object. Jeśli na przykład typ V wartości zastępuje metodę Object.ToString(), instrukcja jest emitowana; jeśli tak nie jest, callboxV.ToString() instrukcja i callvirtObject.ToString() instrukcja są emitowane. Problem z przechowywaniem wersji może wystąpić w pierwszym przypadku, jeśli przesłonięcia zostanie później usunięte, a w drugim przypadku, jeśli zastąpienie zostanie później dodane.

Prefiks constrained może być również używany do wywoływania metod interfejsu w typach wartości, ponieważ metoda typu wartości implementowania metody interfejsu może zostać zmieniona przy użyciu metody MethodImpl. constrained Jeśli prefiks nie jest używany, kompilator jest zmuszony do wybrania metod typu wartości do powiązania z w czasie kompilacji. Użycie prefiksu constrained umożliwia MSIL powiązanie z metodą, która implementuje metodę interfejsu w czasie wykonywania, a nie w czasie kompilacji.

Następujące Emit przeciążenie metody może używać constrained kodu opcode:

Dotyczy