CIL指令“isinst <valuetype>”</valuetype>

时间:2010-08-23 21:33:07

标签: cil

ECMA公共语言基础结构文档说明了有关CIL“isinst class ”的说明:

  

正确的CIL确保是一个有效的typeref或typedef或指示类的typespec标记,并且    obj 始终为null或对象引用。

这意味着不允许使用值类型,对吧?但是mscorlib.dll包含一个方法System.RuntimeTypeHandle :: Equals(object obj),其中包含以下指令:

  

IL_0001:isinst System.RuntimeTypeHandle

System.RuntimeTypeHandle是一个值类型。有人能把我放在这儿吗?

1 个答案:

答案 0 :(得分:2)

查看RuntimeTypeHandle的声明:

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

虽然RuntimeTypeHandle被声明为结构,但它在CIL中的表示是某种特殊类。换句话说,您可以将结构体想象为继承自System.ValueType并且其属性遵循严格顺序的特殊类。

考虑到这一点,isinst可以使用RuntimeTypeHandle进行调用。对于我所解释的isinst,只要有一个代表该类型的类,就不仅限于引用类型。

假设我们用C#编写:

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

我们收到编译器警告

  

警告:给定的表达式始终是提供的('int')类型。

会发生什么?我们将4分配给ii成为int。在下一行i被自动装箱到其对应的ReferenceType(类),因此警告很明显。我们甚至可以写

var b = i is int;

我希望这有助于对这一主题进行某种澄清。