我有什么理由不能使用以下代码吗?
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?)
我知道如何解决问题。我只是想知道原因。
感谢。
答案 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文章中仍有一些价值。它提供的信息可以解释失败案例无法解决的原因,但不能解释为什么其他案例无效。确实有趣的问题。