设0为对象类型的变量。假设它的值为null。设1是布尔类型的变量。
是CIL:
ldloc 0
stloc 1
有效?如果它有效,是否有可以编译的C#?
答案 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#,因为x
和y
都未初始化)
编辑:您已编辑问题以引入类型信息 - 假设x
和y
属于x
为object
且{y
的不同类型1}} bool
无法工作。