首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个CIL有效吗?

这个CIL有效吗?
EN

Stack Overflow用户
提问于 2018-01-18 10:20:40
回答 2查看 154关注 0票数 1

设0是一个对象类型的变量。假设它的值是空的。设1是布尔型变量。

是CIL:

代码语言:javascript
复制
ldloc 0
stloc 1

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-18 10:27:52

我不认为这是正确的,因为大小是不同的--特别是在x64上。引用stloc的话:

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

对于空测试,我认为您需要:

代码语言:javascript
复制
ldloc.0 
ldnull
ceq

如果是null,则返回1,否则为0。为了逆转这一点,也许:

代码语言:javascript
复制
ldc.i4.0
ldloc.0 
ldnull
ceq
ceq
stloc.1  

编辑:我测试了以下内容:

代码语言:javascript
复制
object o = GetObj();
bool b = o != null;

编译器发出:

代码语言:javascript
复制
ldloc.0 
ldnull 
cgt.un 
stloc.1  

所以也许cgt.un是你所需要的!

票数 1
EN

Stack Overflow用户

发布于 2018-01-18 10:28:23

这个

代码语言:javascript
复制
ldloc 0

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

这个

代码语言:javascript
复制
stloc 1

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

这个C#版本应该或多或少地类似于

代码语言:javascript
复制
object x, y;

y = x;

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

编辑:当您编辑这个问题来介绍类型信息时,假设xy是不同类型的,其中xobjecty是不能工作的bool

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48318911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档