为什么在使用三元运算符时需要将十六进制值显式转换为字节类型?

4

例如:

byte a = 0x01; // Works fine
byte b = foo() ? 0x01 : 0x02; // Get error "Cannot impicitly convert int to byte"

为什么会这样呢?


@JonasW 这并不完全是重复的问题,因为 OP 知道强制转换可以修复他代码片段中的第二行;他不确定为什么第一行不需要强制转换。 - Sergey Kalinichenko
1个回答

2
当您将一个数字文字(无论是十六进制还是十进制)分配给类型为byte的变量时,编译器会检查该值是否适合byte。一旦编译器知道该值适合,它会将文字视为byte类型,与变量类型匹配。
然而,当您使用三元表达式时,编译器不再确定表达式的值是什么。默认情况下,它将条件表达式中的值视为整数文字,因为没有类型转换。因此,编译器看到的是将非常量int表达式分配给类型为byte的变量。这触发了您所看到的错误。

奇怪的行为,因为我试图分配常量值,我的意思是为什么编译器不能确定0x01和0x02可以适合字节? - Artem Sokolov
@ArtemSokolov 是否被三元表达式遮盖了。 - Mephy
@ArtemSokolov 你说得对,编译器有足够的信息来确定三元表达式右侧的两个值都是常量,并且这两个常量都适合于 byte 类型。加上排中律原则,这应该给编译器提供了一种不需要强制转换的方法。然而,在编译器中实现这个功能比要求程序员放置显式转换更难,对于编译器团队来说肯定更容易(因为他们什么也不用做 :-))。 - Sergey Kalinichenko
@dasblinkenlight 好的)感谢您提供完整的答案。 - Artem Sokolov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接