ECMA公共语言基础结构文档说明了有关CIL“isinst class ”的说明:
正确的CIL确保类是一个有效的typeref或typedef或指示类的typespec标记,并且 obj 始终为null或对象引用。
这意味着不允许使用值类型,对吧?但是mscorlib.dll包含一个方法System.RuntimeTypeHandle :: Equals(object obj),其中包含以下指令:
IL_0001:isinst System.RuntimeTypeHandle
System.RuntimeTypeHandle是一个值类型。有人能把我放在这儿吗?
答案 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
分配给i
。 i
成为int
。在下一行i
被自动装箱到其对应的ReferenceType
(类),因此警告很明显。我们甚至可以写
var b = i is int;
我希望这有助于对这一主题进行某种澄清。