2010-08-23 7 views
1

Le ECMA Common Language documentation de l'infrastructure dit ceci au sujet du CIL "isinst classe" instruction:instruction CIL "isinst <valuetype>"

CIL correcte garantit que classe est un typeref valide ou typedef ou un jeton TypeSpec indiquant une classe, et que obj est toujours soit null soit une référence d'objet.

Ceci implique qu'un type de valeur n'est pas autorisé, n'est-ce pas? Mais mscorlib.dll contient une méthode System.RuntimeTypeHandle :: equals (Object obj) avec l'instruction suivante:

IL_0001: isinst System.RuntimeTypeHandle

Et System.RuntimeTypeHandle est un valuetype. Quelqu'un peut-il me mettre ici?

Répondre

2

Jetez un oeil à la déclaration de RuntimeTypeHandle:

.class public sequential ansi serializable sealed beforefieldinit RuntimeTypeHandle 
    extends  System.ValueType 
    implements System.Runtime.Serialization.ISerializable 

Bien que RuntimeTypeHandle est déclaré comme struct sa représentation dans CIL est une sorte de classe spéciale. En d'autres termes, vous pouvez imaginer des structures comme des classes spéciales qui héritent de System.ValueType et dont les attributs suivent un ordre strict. Dans cet esprit isinst serait appelable avec RuntimeTypeHandle. Car ce que j'interprète isinst n'est pas du tout limité aux types de référence tant qu'il existe une classe représentant le type.

Disons que nous écrivons en C#:

var i = 4; 
var b = i is Int32; 

Nous obtenons un compilateur avertissement

Avertissement: L'expression donnée est toujours la condition ('int') type.

Que se passe-t-il? Nous affectons 4 à i. i devient un int. Sur la ligne suivante i est en cours d'auto-boxed à son correspondant ReferenceType (classe), de sorte que l'avertissement est évident. Nous pourrions même écrire

var b = i is int; 

J'espère que cela peut contribuer à une sorte de clearification sur ce sujet.

+0

En d'autres termes, "isinst " signifie vraiment "isinst "? – TonyK

+0

@TonyK - Je crois que c'est correct - notez que votre partie citée de la spécification indique que _obj_ doit être null ou une référence d'objet, donc cela n'aurait pas de sens que ce soit un type de valeur sans boîte. – kvb

+0

En fait, 'is 'est traduit en' isinst int32'. Dans le réflecteur 'int32' peut être cliqué et des références à' System.Int32'. La même chose avec d'autres types de valeur comme 'bool'. – Andreas