这个 CIL 有效吗?
Is this CIL valid?
令 0 为对象类型的变量。假设它的值为空。设 1 为布尔类型的变量。
是否为CIL:
ldloc 0
stloc 1
有效吗?如果有效,有没有可以编译成这个的C#?
我 认为 无效,因为大小不同 - 特别是在 x64 上。引用自 stloc:
The type of the value must match the type of the local variable as specified in the current method's local signature.
对于空测试,我想你想要:
ldloc.0
ldnull
ceq
如果它是 null
,它将 return 为 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
就是您所需要的!
ldloc 0
将第一个局部变量加载到堆栈上。
stloc 1
将变量从栈中放入第二个局部变量。
这个的C#版本应该或多或少像
object x, y;
y = x;
(尽管这不是有效的 C#,因为 x
和 y
都未初始化)
编辑:当您编辑问题以引入类型信息时 - 假设 x
和 y
是不同的类型,其中 x
是 object
和 y
是 bool
是行不通的。
令 0 为对象类型的变量。假设它的值为空。设 1 为布尔类型的变量。
是否为CIL:
ldloc 0
stloc 1
有效吗?如果有效,有没有可以编译成这个的C#?
我 认为 无效,因为大小不同 - 特别是在 x64 上。引用自 stloc:
The type of the value must match the type of the local variable as specified in the current method's local signature.
对于空测试,我想你想要:
ldloc.0
ldnull
ceq
如果它是 null
,它将 return 为 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
就是您所需要的!
ldloc 0
将第一个局部变量加载到堆栈上。
stloc 1
将变量从栈中放入第二个局部变量。
这个的C#版本应该或多或少像
object x, y;
y = x;
(尽管这不是有效的 C#,因为 x
和 y
都未初始化)
编辑:当您编辑问题以引入类型信息时 - 假设 x
和 y
是不同的类型,其中 x
是 object
和 y
是 bool
是行不通的。