OpCodes.Constrained Campo
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
Comentários
A tabela a seguir lista o formato de assembly hexadecimal e msil 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 o tipo T . |
O constrained
prefixo é permitido apenas em uma callvirt
instrução.
O estado da pilha MSIL neste ponto deve ser o seguinte:
Um ponteiro gerenciado,
ptr
, é enviado por push para a pilha. O tipo deptr
deve ser um ponteiro gerenciado (&
) parathisType
. Observe que isso é diferente do caso de uma instrução não prefixadacallvirt
, que espera uma referência dethisType
.Os argumentos de método são enviados
arg1
por push para a pilha, assim como com uma instrução não prefixadacallvirt
.argN
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 por constrained
thisType
, a instrução é executada da seguinte maneira:
Se
thisType
for um tipo de referência (em vez de um tipo de valor), seráptr
desreferenciado e passado como o ponteiro 'this' para ocallvirt
demethod
.Se
thisType
for um tipo de valor ethisType
implementarmethod
, seráptr
passado sem modificação como o ponteiro 'this' para umacall
method
instrução, para a implementação demethod
porthisType
.Se
thisType
for um tipo de valor ethisType
não implementarmethod
, seráptr
desreferenciado, em caixa e passado como o ponteiro 'this' para acallvirt
method
instrução.
Esse último caso só pode ocorrer quando method
foi definido em Object, ValueTypeou Enum e não substituído por thisType
. Nesse caso, o boxing faz com que uma cópia do objeto original seja feita. No entanto, como nenhum dos métodos de Object, ValueTypee Enum modificam 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 'this' descrita acima em tempo de compilação, dependendo do tipo de ptr
e do 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 é 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, il diferente deve ser emitido dependendo se um tipo de valor substitui ou não um método de 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 associar em tempo de compilação. O uso do constrained
prefixo permite que o 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 Emit a seguir pode usar o constrained
opcode:
Aplica-se a
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de