这个 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#,因为 xy 都未初始化)

编辑:当您编辑问题以引入类型信息时 - 假设 xy 是不同的类型,其中 xobjectybool 是行不通的。