代码之家  ›  专栏  ›  技术社区  ›  Nick

此CIL有效吗?

  •  1
  • Nick  · 技术社区  · 8 年前

    是CIL:

    ldloc 0
    stloc 1
    

    有效的如果它是有效的,是否有C#可以编译成这个?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Marc Gravell    8 年前

    我不 认为 这可能是有效的,因为大小不同,特别是在x64上。引用stloc:

    值的类型必须与当前方法的局部签名中指定的局部变量的类型匹配。

    对于空测试,我认为您需要:

    ldloc.0 
    ldnull
    ceq
    

    如果是,则返回1 null ,否则为0。为了扭转这种局面,或许:

    ldc.i4.0
    ldloc.0 
    ldnull
    ceq
    ceq
    stloc.1  
    

    编辑:我测试了以下内容:

    object o = GetObj();
    bool b = o != null;
    

    编译器发出:

    ldloc.0 
    ldnull 
    cgt.un 
    stloc.1  
    

    所以也许 cgt.un 这就是你所需要的一切!

        2
  •  0
  •   Wiktor Zychla    8 年前

    这个

    ldloc 0
    

    将第一个局部变量加载到堆栈上。

    这个

    stloc 1
    

    将堆栈中的变量放入第二个局部变量。

    C#版本应大致类似

    object x, y;
    
    y = x;
    

    (虽然这不是有效的C#作为两者 x y

    编辑:当您编辑问题以引入类型信息时-假设 x个 y 属于不同类型,其中 x个 object y bool 那行不通。