设0是一个对象类型的变量。假设它的值是空的。设1是布尔型变量。
是CIL:
ldloc 0
stloc 1有效吗?如果它是有效的,是否有可以编译到此的C#?
发布于 2018-01-18 10:27:52
我不认为这是正确的,因为大小是不同的--特别是在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是你所需要的!
发布于 2018-01-18 10:28:23
这个
ldloc 0将第一个局部变量加载到堆栈上。
这个
stloc 1将变量从堆栈放到第二个局部变量。
这个C#版本应该或多或少地类似于
object x, y;
y = x;(虽然这不是有效的C#,因为x和y都未初始化)
编辑:当您编辑这个问题来介绍类型信息时,假设x和y是不同类型的,其中x是object,y是不能工作的bool。
https://stackoverflow.com/questions/48318911
复制相似问题