作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试生成动态方法。假设我有 bool 值 arg
在堆栈中。我想调用一个接受 int
类型参数的方法将从 bool
转换而来通过简单规则得出的值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--
发射时OpCodes.Brtrue_S
和OpCodes.Br_S
如何正确识别要跳转到的偏移量?
最佳答案
如果您确实只想将 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);
关于c# - 如何在 IL 代码中发出三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17450096/
我是一名优秀的程序员,十分优秀!