我遇到了一种奇怪的情况,想知道我为什么要这样做。我正在使用.NET 3.5。
这有效:
short foo;
if (isValid)
foo = -1;
else
foo = getFoo();
这不起作用:
short foo;
foo = isValid ? -1 : getFoo();
我必须转发-1:
short foo;
foo = isValid ? (short)-1 : getFoo();
三元表达式有何不同?它认为-1是一个需要被转换为short的int。但为什么呢?
答案 0 :(得分:11)
答案 1 :(得分:6)
因为默认情况下-1是整数。编译器告诉您必须明确告诉它要做什么,而不是编译器对您想要做的事情进行假设,这样更安全。
你的榜样很直接。通过一些额外的工作,编译器显然可以看到你希望-1为短。尽管如此,所有边缘情况都伴随着隐式转换。如果你为编译器添加一个规则来假设你想要什么,那么你必须将它应用于每个不仅仅是一个的情况,而这就是它变得困难的地方。
作为一个注释,您应该查看Eric Lippert's博客,因为我知道他介绍了编译器为什么不做出这样的假设。
答案 2 :(得分:1)
应用于int
和short
的条件运算符属于int
类型;编译器不会从您为其指定的类型推断表达式的类型。
您无法将此short
表达式隐式转换为int
。
答案 3 :(得分:0)
条件运算符强制两个可能的结果表达式具有相同的类型。在这种情况下,左侧是int
,右侧是short
方法返回的getPoo
。由于将short转换为int
始终是安全的,因此编译器会选择操作的结果为int
。
因此,结果将int
分配给short
,这就是为什么你需要明确地将它转换为简短的。
如果明确使用if / else方法,您将为short指定一个文字整数,这允许编译器验证文字整数是否安全地分配给short而无需显式转换。
有关内部解释,请查看: