OpCodes.Constrained Campo

Definição

Restringe o tipo no qual uma chamada de método virtual é feita.

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 do campo

OpCode

Comentários

A tabela a seguir lista o formato de assembly hexadecimal e msil (idioma intermediário da Microsoft) da instrução, juntamente com um breve resumo de referência:

Formatar Formato de assembly Descrição
FE 16 < T > Restrita. thisType Chame um método virtual em um tipo restrito para ser tipo T.

O constrained prefixo é permitido somente em uma callvirt instrução.

O estado da pilha MSIL neste ponto deve ser o seguinte:

  1. Um ponteiro ptrgerenciado é empurrado para a pilha. O tipo de ptr deve ser um ponteiro gerenciado (&) para thisType. Observe que isso é diferente do caso de uma instrução não prefixada callvirt , que espera uma referência de thisType.

  2. Os argumentos de método são enviados arg1 argN por push para a pilha, assim como com uma instrução não prefixada callvirt .

O constrained prefixo foi projetado para permitir que callvirt as instruções sejam feitas de forma uniforme, independentemente de ser thisType um tipo de valor ou um tipo de referência.

Quando uma callvirt method instrução foi prefixada, constrained thisTypea instrução é executada da seguinte maneira:

  • Se thisType for um tipo de referência (em vez de um tipo de valor), será ptr desreferido e passado como o ponteiro 'this' para o callvirt de method.

  • Se thisType for um tipo de valor e thisType implementado method , será ptr passado sem modificação como o ponteiro 'this' para uma call method instrução, para a implementação de method by thisType.

  • Se thisType for um tipo de valor e thisType não for implementado method , será ptr desreferenciado, em caixa e passado como o ponteiro "este" para a callvirt method instrução.

Esse último caso pode ocorrer somente quando method foi definido em Object, ValueTypeou Enum não substituído por thisType. Nesse caso, o boxe faz com que uma cópia do objeto original seja feita. No entanto, como nenhum dos métodos de Object, ValueTypee Enum modificar o estado do objeto, esse fato não pode ser detectado.

O constrained prefixo dá suporte a geradores IL que criam código genérico. Normalmente, a callvirt instrução não é válida em tipos de valor. Em vez disso, é necessário que os compiladores il executem efetivamente a transformação "esta" descrita acima no tempo de compilação, dependendo do tipo e do ptr método que está sendo chamado. No entanto, quando ptr é um tipo genérico desconhecido no momento da compilação, não é possível fazer essa transformação em tempo de compilação.

O constrained opcode permite que os compiladores il façam uma chamada para uma função virtual de forma uniforme, independentemente de ser ptr um tipo de valor ou um tipo de referência. Embora se destine ao caso thisType em que se trata de uma variável de tipo genérico, o constrained prefixo também funciona para tipos não genéricos e pode reduzir a complexidade da geração de chamadas virtuais em linguagens que ocultam a distinção entre tipos de valor e tipos de referência.

O uso do constrained prefixo também evita possíveis problemas de controle de versão com tipos de valor. Se o constrained prefixo não for usado, o IL diferente deverá ser emitido dependendo se um tipo de valor substitui ou não um método system.object. Por exemplo, se um tipo V de valor substituir o método Object.ToString(), uma call V.ToString() instrução será emitida; se não o fizer, uma box instrução e uma callvirt Object.ToString() instrução serão emitidas. Um problema de controle de versão poderá surgir no caso anterior se a substituição for removida posteriormente e, no último caso, se uma substituição for adicionada posteriormente.

O constrained prefixo também pode ser usado para invocação de métodos de interface em tipos de valor, pois o método de tipo de valor que implementa o método de interface pode ser alterado usando um MethodImpl. Se o constrained prefixo não for usado, o compilador será forçado a escolher a qual dos métodos do tipo de valor se associar em tempo de compilação. O uso do constrained prefixo permite que a MSIL se associe ao método que implementa o método de interface em tempo de execução, em vez de em tempo de compilação.

A sobrecarga do método a seguir Emit pode usar o constrained opcode:

Aplica-se a