如何在 IL 代码中发出三元运算符

Dem*_*sch 2 c# il ilgenerator

我正在尝试生成动态方法。假设我arg在堆栈中有 bool 值。我想调用一个方法,该方法接受intbool通过简单规则从该值转换的类型参数arg ? 1 : 0。对于一些示例代码,生成的 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--
Run Code Online (Sandbox Code Playgroud)

发射时OpCodes.Brtrue_S以及OpCodes.Br_S如何正确识别要跳转到的偏移量?

svi*_*ick 5

如果你真的只是想转换true1false0,你可以使用一个事实,即类型大于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);
Run Code Online (Sandbox Code Playgroud)