【问题标题】:CIL instruction "isinst <valuetype>"CIL 指令“isinst <valuetype>”
【发布时间】:2011-04-02 21:17:06
【问题描述】:

ECMA 公共语言基础结构文档中关于 CIL“isinst class”指令的说明如下:

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

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

IL_0001: isinst System.RuntimeTypeHandle

并且 System.RuntimeTypeHandle 是一个值类型。谁能把我放在这里?

【问题讨论】:

    标签: cil


    【解决方案1】:

    看看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 分配给iibecoms 和 int。在下一行i被自动装箱到其对应的ReferenceType(类),因此警告很明显。我们甚至可以写

    var b = i is int;
    

    我希望这有助于澄清这个主题。

    【讨论】:

    • 换句话说,“isinst ”真的意味着“isinst ”吗?
    • @TonyK - 我相信这是正确的 - 请注意,您在规范中引用的部分表明 obj 必须为 null 或对象引用,所以它没有意义使其成为未装箱的值类型。
    • 其实is int被翻译成isinst int32。在反射器中int32 可以单击并引用System.Int32。与 bool 等其他值类型相同。
    猜你喜欢
    • 2021-06-21
    • 2014-06-20
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多