OpCodes.Constrained Champ

Définition

Contraint le type sur lequel un appel à une 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 MSIL (hexadécimal) de l’instruction, ainsi qu’un bref résumé des références :

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é, ptr, est poussé vers la pile. Le type de ptr doit être un pointeur managé (&) vers thisType. Notez que cela diffère du cas d’une instruction non corrigé callvirt , qui attend une référence de thisType.

  2. Les arguments de méthode via sont poussés arg1 sur la pile, tout comme avec une instruction non corrigécallvirt.argN

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

Lorsqu’une callvirtmethod instruction a été préfixée par constrainedthisType, l’instruction est exécutée comme suit :

  • Si thisType est un type référence (par opposition à un type valeur), est ptr déréférencé et passé en tant que pointeur « this » vers le callvirt de method.

  • Si thisType est un type valeur et thisType implémente method , ptr est passé sans modification comme pointeur « this » vers une callmethod instruction, pour l’implémentation de method par thisType.

  • Si thisType est un type valeur et thisType n’implémente method pas, est ptr déréférencé, encadré et passé comme pointeur « this » vers l’instruction callvirtmethod .

Ce dernier cas peut se produire uniquement lorsque method a été défini sur Object, ValueTypeou Enum et qu’il n’est pas remplacé par thisType. Dans ce cas, le boxing entraîne la création d’une copie de l’objet d’origine. Toutefois, étant donné qu’aucune des méthodes de Object, ValueTypeet Enum ne modifie l’état de l’objet, 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 de et de ptr la méthode appelée. Toutefois, quand ptr est 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 du ptr type valeur ou référence. Bien qu’il soit destiné au cas où thisType est 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 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é, un il différent doit ê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 le premier cas si le remplacement est supprimé ultérieurement, et dans le 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 des 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 obligé de choisir les méthodes du type de valeur à lier au moment de la compilation. L’utilisation du constrained préfixe permet à MSIL de 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 à