为什么我不能使用下面的代码?
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;
}我知道如何解决这个问题。我只想知道原因。
谢谢。
发布于 2015-09-30 17:04:35
让我们看看第二个方法的最终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中),而在IL_0002,这个文本被转换为Int64。
来自MSDN:
int类型的常量表达式(第7.15节)可以转换为s字节、字节、短、ushort、uint或ulong类型,条件是常量表达式的值在目标类型的范围内。
由于1在ulong数据类型的范围内,这种转换总是成功的。编译器知道这一点,因此执行隐式转换。
发布于 2015-09-30 17:02:38
输入为int的变量不能隐式转换为ulong,因为int可以表示负值,而ulong不能。只要常数表达式的值是非负的,则可以隐式转换常量.
第二个例子是一个常量表达式。
发布于 2015-09-30 16:51:54
这将起作用:
ulong test(int a, int b)
{
return a == b ? 0UL : 1UL;
}看,编译器根据数字的大小推断类型,所以如果你想要一个特定的类型,你必须给后缀。请参阅此MSDN页面上的文字部分
编辑:正如我所指出的,这个问题并不是在寻找如何让它发挥作用的答案。我相信在MSDN文章链接中仍然有一些价值。它提供的信息可以解释为什么失败的情况不能工作,但不能解释为什么其他的通过。确实很有趣的问题。
https://stackoverflow.com/questions/32871598
复制相似问题