为什么我必须在三元表达式中对int进行类型转换?

时间:2010-06-30 14:13:19

标签: c# ternary-operator casting boolean-expression

  

可能重复:
  Conditional operator cannot cast implicitly?

我遇到了一种奇怪的情况,想知道我为什么要这样做。我正在使用.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。但为什么呢?

4 个答案:

答案 0 :(得分:11)

答案 1 :(得分:6)

因为默认情况下-1是整数。编译器告诉您必须明确告诉它要做什么,而不是编译器对您想要做的事情进行假设,这样更安全。

你的榜样很直接。通过一些额外的工作,编译器显然可以看到你希望-1为短。尽管如此,所有边缘情况都伴随着隐式转换。如果你为编译器添加一个规则来假设你想要什么,那么你必须将它应用于每个不仅仅是一个的情况,而这就是它变得困难的地方。

作为一个注释,您应该查看Eric Lippert's博客,因为我知道他介绍了编译器为什么不做出这样的假设。

答案 2 :(得分:1)

应用于intshort的条件运算符属于int类型;编译器不会从您为其指定的类型推断表达式的类型。

您无法将此short表达式隐式转换为int

答案 3 :(得分:0)

条件运算符强制两个可能的结果表达式具有相同的类型。在这种情况下,左侧是int,右侧是short方法返回的getPoo。由于将short转换为int始终是安全的,因此编译器会选择操作的结果为int

因此,结果将int分配给short,这就是为什么你需要明确地将它转换为简短的。

如果明确使用if / else方法,您将为short指定一个文字整数,这允许编译器验证文字整数是否安全地分配给short而无需显式转换。

有关内部解释,请查看:

Cast operators do not obey the distributive law