在inline-if中返回ulong

时间:2015-09-30 16:48:18

标签: c# ternary-operator conditional-operator ulong

我有什么理由不能使用以下代码吗?

EventLogEntry

它告诉我:

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?)

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

感谢。

3 个答案:

答案 0 :(得分: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

IL_0001,文字1被压入堆栈(因此表达式return false ? 0 : 1;在编译时被计算并作为常量嵌入到IL中)和{{1}这个文字被转换为IL_0002

来自MSDN:

  

int类型的常量表达式(第7.15节)可以转换为   输入sbyte,byte,short,ushort,uint或ulong,提供值   constant-expression在目标类型的范围内。

由于Int64位于1数据类型的范围内,因此此类转换将始终成功。编译器知道这一点,因此执行隐式转换。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

这将有效:

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

请参阅,编译器根据数字大小推断出类型,因此如果您需要特定类型,则必须提供后缀。请参阅此MSDN page

上的文字部分

编辑:正如我所指出的,这个问题并没有找到如何让它发挥作用的答案。我相信在链接的MSDN文章中仍有一些价值。它提供的信息可以解释失败案例无法解决的原因,但不能解释为什么其他案例无效。确实有趣的问题。