OpCodes.Constrained Campo

Definición

Restringe el tipo en el que se realiza una llamada a método virtual.Constrains the type on which a virtual method call is made.

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 

Valor de campo

OpCode

Comentarios

En la tabla siguiente se muestra el formato de ensamblado hexadecimal de la instrucción y del lenguaje intermedio de Microsoft (MSIL), junto con un breve resumen de referencia:The following table lists the instruction's hexadecimal and Microsoft intermediate language (MSIL) assembly format, along with a brief reference summary:

FormatoFormat Formato de ensambladoAssembly Format DescripciónDescription
< FE 16 T >FE 16 < T > restringida.constrained. thisType Llame a un método virtual en un tipo restringido para que sea de tipo T .Call a virtual method on a type constrained to be type T.

El constrained prefijo solo se permite en una callvirt instrucción.The constrained prefix is permitted only on a callvirt instruction.

El estado de la pila de MSIL en este punto debe ser el siguiente:The state of the MSIL stack at this point must be as follows:

  1. Un puntero administrado, ptr , se inserta en la pila.A managed pointer, ptr, is pushed onto the stack. El tipo de ptr debe ser un puntero administrado ( & ) a thisType .The type of ptr must be a managed pointer (&) to thisType. Tenga en cuenta que esto es diferente de las mayúsculas y minúsculas de una instrucción sin prefijo callvirt , que espera una referencia de thisType .Note that this is different from the case of an unprefixed callvirt instruction, which expects a reference of thisType.

  2. Los argumentos de método arg1 a través argN se insertan en la pila, al igual que con una instrucción sin prefijo callvirt .Method arguments arg1 through argN are pushed onto the stack, just as with an unprefixed callvirt instruction.

El constrained prefijo está diseñado para permitir que las callvirt instrucciones se realicen de forma uniforme independientemente de si thisType es un tipo de valor o un tipo de referencia.The constrained prefix is designed to allow callvirt instructions to be made in a uniform way independent of whether thisType is a value type or a reference type.

Cuando se ha callvirt method precedido una instrucción constrained thisType , la instrucción se ejecuta de la siguiente manera:When a callvirt method instruction has been prefixed by constrained thisType, the instruction is executed as follows:

  • Si thisType es un tipo de referencia (en oposición a un tipo de valor), ptr se desreferencia y se pasa como el puntero ' this ' al callvirt de method .If thisType is a reference type (as opposed to a value type) then ptr is dereferenced and passed as the 'this' pointer to the callvirt of method.

  • Si thisType es un tipo de valor e thisType implementa method , ptr se pasa sin modificar como el puntero ' this ' a una call method instrucción para la implementación de method por thisType .If thisType is a value type and thisType implements method then ptr is passed unmodified as the 'this' pointer to a call method instruction, for the implementation of method by thisType.

  • Si thisType es un tipo de valor y thisType no implementa method , ptr se desreferencia, se aplica la conversión boxing y se pasa como el puntero ' this ' a la callvirt method instrucción.If thisType is a value type and thisType does not implement method then ptr is dereferenced, boxed, and passed as the 'this' pointer to the callvirt method instruction.

Este último caso solo se puede producir cuando method se definió en Object , ValueType o Enum y no se reemplaza por thisType .This last case can occur only when method was defined on Object, ValueType, or Enum and not overridden by thisType. En este caso, la conversión boxing hace que se realice una copia del objeto original.In this case, the boxing causes a copy of the original object to be made. Sin embargo, dado que ninguno de los métodos de Object , ValueType y Enum modifica el estado del objeto, no se puede detectar este hecho.However, because none of the methods of Object, ValueType, and Enum modify the state of the object, this fact cannot be detected.

El constrained prefijo admite generadores de Il que crean código genérico.The constrained prefix supports IL generators that create generic code. Normalmente, la callvirt instrucción no es válida en los tipos de valor.Normally the callvirt instruction is not valid on value types. En su lugar, es necesario que los compiladores de IL realicen eficazmente la transformación ' this ' descrita anteriormente en tiempo de compilación, dependiendo del tipo de ptr y del método al que se llama.Instead it is required that IL compilers effectively perform the 'this' transformation outlined above at compile time, depending on the type of ptr and the method being called. Sin embargo, cuando ptr es un tipo genérico desconocido en tiempo de compilación, no es posible realizar esta transformación en tiempo de compilación.However, when ptr is a generic type that is unknown at compile time, it is not possible to make this transformation at compile time.

El constrained código de operación permite que los compiladores de Il realicen una llamada a una función virtual de una manera uniforme independientemente de si ptr es un tipo de valor o un tipo de referencia.The constrained opcode allows IL compilers to make a call to a virtual function in a uniform way independent of whether ptr is a value type or a reference type. Aunque está pensado para el caso en el que thisType es una variable de tipo genérico, el constrained prefijo también funciona para los tipos no genéricos y puede reducir la complejidad de la generación de llamadas virtuales en lenguajes que ocultan la distinción entre tipos de valor y tipos de referencia.Although it is intended for the case where thisType is a generic type variable, the constrained prefix also works for nongeneric types and can reduce the complexity of generating virtual calls in languages that hide the distinction between value types and reference types.

El uso del constrained prefijo también evita posibles problemas de control de versiones con tipos de valor.Using the constrained prefix also avoids potential versioning problems with value types. Si constrained no se usa el prefijo, se debe emitir otro Il dependiendo de si un tipo de valor invalida un método de System. Object.If the constrained prefix is not used, different IL must be emitted depending on whether or not a value type overrides a method of System.Object. Por ejemplo, si un tipo de valor V invalida el método Object. ToString (), call V.ToString() se emite una instrucción; si no es así, box se emite una instrucción y una callvirt Object.ToString() instrucción.For example, if a value type V overrides the Object.ToString() method, a call V.ToString() instruction is emitted; if it does not, a box instruction and a callvirt Object.ToString() instruction are emitted. En el caso anterior, se puede producir un problema de control de versiones si después se quita la invalidación y, en este último caso, se agrega una invalidación posteriormente.A versioning problem can arise in the former case if the override is later removed, and in the latter case if an override is later added.

El constrained prefijo también se puede usar para la invocación de métodos de interfaz en tipos de valor, porque el método de tipo de valor que implementa el método de interfaz se puede cambiar mediante MethodImpl .The constrained prefix can also be used for invocation of interface methods on value types, because the value type method implementing the interface method can be changed using a MethodImpl. Si constrained no se usa el prefijo, el compilador se ve obligado a elegir cuál de los métodos del tipo de valor se va a enlazar en tiempo de compilación.If the constrained prefix is not used, the compiler is forced to choose which of the value type's methods to bind to at compile time. El uso del constrained prefijo permite que el MSIL se enlace al método que implementa el método de interfaz en tiempo de ejecución, en lugar de en tiempo de compilación.Using the constrained prefix allows the MSIL to bind to the method that implements the interface method at run time, rather than at compile time.

La siguiente Emit sobrecarga del método puede utilizar el constrained código de operación:The following Emit method overload can use the constrained opcode:

Se aplica a