OpCodes.Constrained Champ

Définition

Limite le type sur lequel un appel de méthode virtuelle est effectué.

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 

Valeur de champ

Remarques

Le tableau suivant répertorie le format d'assembly hexadécimal et Microsoft (MSIL) de l'instruction, ainsi qu'un bref résumé de référence :

Format Format d’assembly Description
FE 16 <T> Contraint. thisType Appelez une méthode virtuelle sur un type contraint à être de type T.

Le constrained préfixe est autorisé uniquement sur une callvirt instruction.

L’état de la pile MSIL à ce stade doit être le suivant :

  1. Un pointeur managé, est ptrenvoyé (push) sur la pile. Le type de ptr doit être un pointeur managé (&) vers thisType. Notez que cela diffère du cas d’une instruction non préfixée callvirt , qui attend une référence de thisType.

  2. Les arguments arg1 de méthode sont argN envoyés (push) sur la pile, comme avec une instruction non préfixée callvirt .

Le constrained préfixe est conçu pour permettre callvirt aux instructions d’être effectuées de manière uniforme, indépendamment d’un thisType type valeur ou d’un type référence.

Lorsqu’une instruction a été précédée d’un callvirtmethodconstrainedthisTypepréfixe, l’instruction est exécutée comme suit :

  • S’il s’agit thisType d’un type référence (par opposition à un type valeur), ptr il est déréférencé et passé en tant que pointeur « this » à l’objet callvirtmethod.

  • S’il thisType s’agit d’un type valeur et thisType implémentemethod, il ptr est passé non modifié en tant que pointeur « this » vers unemethodcallinstruction, pour l’implémentation de method par thisType.

  • S’il thisType s’agit d’un type valeur et thisType n’implémente method pas, ptr il est déréférencé, boxé et passé en tant que pointeur « this » à l’instruction callvirtmethod .

Ce dernier cas peut se produire uniquement lorsqu’il method a été défini sur Object, ValueTypeou Enum non substitué par thisType. Dans ce cas, la boxe entraîne la création d’une copie de l’objet d’origine. Toutefois, étant donné qu’aucune des méthodes de l’objet, et qu’aucune Enum des méthodes de Objectl’objet ValueTypen’est modifiable, ce fait ne peut pas être détecté.

Le constrained préfixe prend en charge les générateurs IL qui créent du code générique. Normalement, l’instruction callvirt n’est pas valide sur les types valeur. Au lieu de cela, il est nécessaire que les compilateurs IL effectuent efficacement la transformation « this » décrite ci-dessus au moment de la compilation, en fonction du type et de ptr la méthode appelée. Toutefois, lorsqu’il ptr s’agit d’un type générique inconnu au moment de la compilation, il n’est pas possible d’effectuer cette transformation au moment de la compilation.

L’opcode constrained permet aux compilateurs IL d’effectuer un appel à une fonction virtuelle de manière uniforme, indépendamment d’un ptr type valeur ou d’un type référence. Bien qu’il soit destiné au cas où thisType il s’agit d’une variable de type générique, le constrained préfixe fonctionne également pour les types non génériques et peut réduire la complexité de la génération d’appels virtuels dans des langages qui masquent la distinction entre les types valeur et les types de référence.

L’utilisation du constrained préfixe évite également les problèmes potentiels de contrôle de version avec les types valeur. Si le constrained préfixe n’est pas utilisé, différents il doivent être émis selon qu’un type valeur remplace ou non une méthode de System.Object. Par exemple, si un type V valeur remplace la méthode Object.ToString(), une callV.ToString() instruction est émise ; si ce n’est pas le cas, une box instruction et une callvirtObject.ToString() instruction sont émises. Un problème de contrôle de version peut survenir dans l’ancien cas si le remplacement est supprimé ultérieurement et, dans ce dernier cas, si un remplacement est ajouté ultérieurement.

Le constrained préfixe peut également être utilisé pour appeler des méthodes d’interface sur les types valeur, car la méthode de type valeur implémentant la méthode d’interface peut être modifiée à l’aide d’un MethodImpl. Si le constrained préfixe n’est pas utilisé, le compilateur est forcé de choisir les méthodes du type valeur à lier au moment de la compilation. L’utilisation du constrained préfixe permet à MSIL de se lier à la méthode qui implémente la méthode d’interface au moment de l’exécution, plutôt qu’au moment de la compilation.

La surcharge de méthode suivante Emit peut utiliser l’opcode constrained :

S’applique à