首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以内联方式返回ulong -if

以内联方式返回ulong -if
EN

Stack Overflow用户
提问于 2015-09-30 16:48:17
回答 3查看 270关注 0票数 6

为什么我不能使用下面的代码?

代码语言:javascript
复制
ulong test(int a, int b)
{
    return a == b ? 0 : 1;
}

它向我展示:

代码语言:javascript
复制
Cannot implicitly convert type 'int' to 'ulong'. An explicit conversion exists (are you missing a cast?)

下列措施将起作用:

代码语言:javascript
复制
ulong test(int a, int b)
{
    return false ? 0 : 1;
}

我知道如何解决这个问题。我只想知道原因。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-30 17:04:35

让我们看看第二个方法的最终IL代码:

代码语言:javascript
复制
IL_0000:  nop
IL_0001:  ldc.i4.1
IL_0002:  conv.i8
IL_0003:  stloc.0
IL_0004:  br.s       IL_0006
IL_0006:  ldloc.0
IL_0007:  ret

IL_0001中,文字1被推到堆栈上(因此表达式return false ? 0 : 1;在编译时被求值,并作为常量嵌入到IL中),而在IL_0002,这个文本被转换为Int64

来自MSDN:

int类型的常量表达式(第7.15节)可以转换为s字节、字节、短、ushort、uint或ulong类型,条件是常量表达式的值在目标类型的范围内。

由于1ulong数据类型的范围内,这种转换总是成功的。编译器知道这一点,因此执行隐式转换。

票数 4
EN

Stack Overflow用户

发布于 2015-09-30 17:02:38

输入为int的变量不能隐式转换为ulong,因为int可以表示负值,而ulong不能。只要常数表达式的值是非负的,则可以隐式转换常量.

第二个例子是一个常量表达式。

票数 2
EN

Stack Overflow用户

发布于 2015-09-30 16:51:54

这将起作用:

代码语言:javascript
复制
ulong test(int a, int b)
{
    return a == b ? 0UL : 1UL;
}

看,编译器根据数字的大小推断类型,所以如果你想要一个特定的类型,你必须给后缀。请参阅此MSDN页面上的文字部分

编辑:正如我所指出的,这个问题并不是在寻找如何让它发挥作用的答案。我相信在MSDN文章链接中仍然有一些价值。它提供的信息可以解释为什么失败的情况不能工作,但不能解释为什么其他的通过。确实很有趣的问题。

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

https://stackoverflow.com/questions/32871598

复制
相关文章

相似问题

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