6

我不能使用以下代码有什么原因吗?

ulong test(int a, int b)
{
    return a == b ? 0 : 1;
}

它向我展示了:

Cannot implicitly convert type 'int' to 'ulong'. An explicit conversion exists (are you missing a cast?)

以下将起作用:

ulong test(int a, int b)
{
    return false ? 0 : 1;
}

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

谢谢。

4

3 回答 3

4

我们来看看第二种方法得到的IL代码:

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

AtIL_0001文字1被压入堆栈(因此表达式return false ? 0 : 1;在编译时被评估并作为常量嵌入到 IL 中)并且在IL_0002此文字被转换为Int64.

来自 MSDN:

如果常量表达式的值在目标类型的范围内,则 int 类型的常量表达式(第 7.15 节)可以转换为 sbyte、byte、short、ushort、uint 或 ulong 类型。

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

于 2015-09-30T17:04:35.817 回答
2

类型为 int 的变量不能隐式转换为 ulong,因为 int 可以表示负值,而 ulong 不能。常量可以隐式转换,前提是常量表达式的值是非负的。

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

于 2015-09-30T17:02:38.087 回答
0

这将起作用:

ulong test(int a, int b)
{
    return a == b ? 0UL : 1UL;
}

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

编辑:正如向我指出的那样,这个问题并不是在寻找如何使其工作的答案。我相信链接的 MSDN 文章还是有一些价值的。它提供的信息可以解释为什么失败案例不起作用,但不能解释为什么其他案例通过。确实很有趣的问题。

于 2015-09-30T16:51:54.467 回答