这个CIL有效吗?

时间:2018-01-18 10:20:40

标签: c# disassembly cil

设0为对象类型的变量。假设它的值为null。设1是布尔类型的变量。

是CIL:

ldloc 0
stloc 1

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

2 个答案:

答案 0 :(得分:1)

我不认为可以有效,因为尺寸不同 - 特别是在x64上。引用stloc:

  

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

对于空测试,我认为你想要:

ldloc.0 
ldnull
ceq

如果是null则返回1,否则返回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

答案 1 :(得分:0)

ldloc 0

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

stloc 1

将变量从堆栈放到第二个局部变量。

C#版本应该或多或少像

object x, y;

y = x;

(虽然这不是有效的C#,因为xy都未初始化)

编辑:您已编辑问题以引入类型信息 - 假设xy属于xobject且{y的不同类型1}} bool无法工作。