条件expression式的types不能确定,因为“int”和“null”之间没有隐式转换

为什么不能编译?

int? number = true ? 5 : null; 

条件expression式的types不能确定,因为“int”和“null”之间没有隐式转换

规范(§7.14)说,条件expression式b ? x : y b ? x : y有三种可能性: xy都有一个types满足一定的条件 ,只有xy中的一个具有types, 并且满足一定的条件 ,或者发生编译时错误。 在这里,“某些好的条件”意味着某些转换是可能的,我们将在下面详细介绍。

现在,我们来看看规范的相关部分:

如果只有一个xy有一个types,并且xy都可以隐式转换为该types,那么这就是条件expression式的types。

这里的问题在于

 int? number = true ? 5 : null; 

只有一个条件结果有一个types。 这里x是一个int文字, ynull ,它没有一个typesnull不能隐式转换为int 1 。 因此,“某些良好的条件”不符合,并发生编译时错误。

有两种方法:

 int? number = true ? (int?)5 : null; 

在这里,我们仍然是只有一个xy有一个types的情况。 请注意, null 仍然没有types,但编译器不会有任何问题,因为(int?)5null都可以隐式转换为int? (§6.1.4和§6.1.5)。

另一种方式显然是:

 int? number = true ? 5 : (int?)null; 

但现在我们必须阅读规范中的不同条款来理解为什么这是好的:

如果xX型, yY

  • 如果存在从XY而不是从YX的隐式转换(第6.1节),则Y是条件expression式的types。

  • 如果存在从YX而不是从XY的隐式转换(第6.1节),则X是条件expression式的types。

  • 否则,不能确定expression式types,并发生编译时错误。

这里x的types是inty的types是int?int?没有隐式转换int? int ,但是有一个从intint?的隐式转换int? 所以expression式的types是int?

1 :还要注意,在确定条件expression式的types时忽略左侧的types,这是一个常见的混淆源。

null没有任何可识别的types – 它只是需要一点点刺激才能使它快乐:

 int? number = true ? 5 : (int?)null;