代码之家  ›  专栏  ›  技术社区  ›  Jonathan ANTOINE

在发出可为空的setter时,操作可能会破坏运行时的稳定性

  •  2
  • Jonathan ANTOINE  · 技术社区  · 14 年前

    一切都很好,除非我把它和一个可为空的属性一起使用。。。。

    下面是我使用的代码:

    ilSetterGen.Emit(OpCodes.Ldarg_0);
    ilSetterGen.Emit(OpCodes.Call, baseGetter);
    ilSetterGen.Emit(OpCodes.Ldarg_1);
    ilSetterGen.Emit(OpCodes.Ceq);
    Label retLabel = ilSetterGen.DefineLabel();
    ilSetterGen.Emit(OpCodes.Brtrue_S, retLabel);
    
    
    
    ilSetterGen.MarkLabel(retLabel);
    ilSetterGen.Emit(OpCodes.Ret);
    

    编辑: 正如答案中指出的问题是在平等测试中。。。我把无关的部分去掉了。。。

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

    和往常一样,首先要做的是查看c中类似的代码作为IL生成了什么,例如通过reflector。

    我不在PC机上,但“ceq”看起来很可疑;它只对一些原语和引用有效;“lifted”equals会检查每个的HasValue,获取每个的值,并使用适当的相等测试——可能是通过“ceq”,但可能是通过对相等运算符(op_*)的静态调用。