小编典典

无法确定条件表达式的类型,因为 'int' 和

all

为什么这不编译?

int? number = true ? 5 : null;

无法确定条件表达式的类型,因为 ‘int’ 和 之间没有隐式转换


阅读 90

收藏
2022-06-13

共1个答案

小编典典

规范(拥抱7.14)说,对于条件表达式b ? x : y,存在三种可能性,一种是xandy都有一个类型 并且 满足某些 好的条件
,只有一个xandy有一个类型 并且 满足某些 好的条件
,或者是编译时错误发生。在这里,“某些良好的条件”意味着某些转换是可能的,我们将在下面详细介绍。

现在,让我们转向规范的密切相关部分:

如果只有一个xandy具有类型,并且两个xandy都可以隐式转换为该类型,那么这就是条件表达式的类型。

这里的问题是

int? number = true ? 5 : null;

只有一个条件结果具有类型。这x是一个int文字,并且yisnull没有类型 并且 不能 隐式转换为
1。因此,不满足“某些好的条件”,并发生编译时错误。 null``int

两种 方法可以解决这个问题:

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

在这里,我们仍然处于只有一个xy具有类型的情况。请注意,null 仍然
没有类型,但编译器对此不会有任何问题,因为(int?)5并且null两者都可以隐式转换为int?(拥抱6.1.4 和拥抱6.1.5)。

另一种方式显然是:

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

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

如果x有类型X并且y有类型Y那么

  • 如果从to存在隐式转换 (搂6.1) ,但从XtoY不存在,则是条件表达式的类型。Y``X``Y

  • 如果从to存在隐式转换 (搂6.1) ,但从YtoX不存在,则是条件表达式的类型。X``Y``X

  • 否则,无法确定表达式类型,并出现编译时错误。

Here xis of typeintyis of type int?。没有从 to
的隐式转换int?int但是有从intto的隐式转换,int?所以表达式的类型是int?

1:进一步注意左侧的类型在确定条件表达式的类型时被忽略,这是一个常见的混淆来源。

2022-06-13