【问题标题】:How to emit ternary operator in IL code如何在 IL 代码中发出三元运算符
【发布时间】:2013-07-03 14:01:32
【问题描述】:

我正在尝试生成动态方法。假设我在堆栈中有布尔值arg。我想调用一个接受int 类型参数的方法,该方法将通过简单的规则arg ? 1 : 0 从bool 值转换。对于一些示例代码,生成的 IL 代码如下:

//bool value is already pushed into stack
IL_003d:  brtrue.s  IL_0042
IL_003f:  ldc.i4.0
IL_0040:  br.s      IL_0043
IL_0042:  ldc.i4.1
IL_0043:  callvirt --methodName--

当发出 OpCodes.Brtrue_S 和 OpCodes.Br_S 时,如何正确识别要跳转到的偏移量?

【问题讨论】:

    标签: c# il ilgenerator


    【解决方案1】:

    如果您真的只想将true 转换为1 和false 转换为0,您可以使用小于 4 字节的类型在堆栈上扩展为 4 字节的事实。这意味着您无需执行任何操作,只需将bool 视为int。

    如果你真的想要一个三元运算符,你可以使用DefineLabel()和MarkLabel()这对方法:

    var trueLabel = il.DefineLabel();
    var endLabel = il.DefineLabel();
    
    il.Emit(OpCodes.Brtrue, trueLabel);
    
    il.Emit(OpCodes.Ldc_I4_0);
    
    il.Emit(OpCodes.Br, endLabel);
    
    il.MarkLabel(trueLabel);
    
    il.Emit(OpCodes.Ldc_I4_1);
    
    il.MarkLabel(endLabel);
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 2017-01-01
      • 2018-06-27
      • 2018-11-08
      • 1970-01-01
      • 2022-01-04
      • 2011-07-08
      • 2021-11-16
      • 2012-06-23
      相关资源
      最近更新 更多