first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。
如果字面量没有后缀,则它具有可以表示其值的第一种类型:int、uint、long、ulong。
考虑:
var value = test ? (Int64)1 : 0;
0,没有后缀的十进制数字文字将转换为int
. int
可以隐式转换为Int64
. 由于这种转换只发生在一个方向上,我们可以放心返回值将是 Int64。
然而:
var value = test ? (UInt64)1 : 0;
UInt64
并且int
不能隐式转换为彼此,但此代码编译并运行,结果类型为UInt64
.
在什么时候0
确定类型?
如果这两种类型可以相互隐式转换,那么您最终会得到这两种类型中的哪一种?(我认为这不会正常发生,但用户生成的类可以实现这种转换。)
先前的研究:
我发现了其他几个标题相似的问题,但它们都与 null 或可为 null 的类型有关。
相关性:这在我的代码中很重要,因为我们会立即将此结果传递给 ByteWriter.Write,并希望以正确的重载结束,从而写入正确的字节数。这些例子当然被大大简化了。
替代语法使结果显式可能是清晰的最佳选择,无论在没有显式转换的情况下实际发生什么:
var value = test ? (UInt64)1 : (UInt64)0;