为什么这不编译?
int? number = true ? 5 : null;
无法确定条件表达式的类型,因为 ‘int’ 和 之间没有隐式转换
规范(拥抱7.14)说,对于条件表达式b ? x : y,存在三种可能性,一种是xandy都有一个类型 并且 满足某些 好的条件 ,只有一个xandy有一个类型 并且 满足某些 好的条件 ,或者是编译时错误发生。在这里,“某些良好的条件”意味着某些转换是可能的,我们将在下面详细介绍。
b ? x : y
x
y
现在,让我们转向规范的密切相关部分:
如果只有一个xandy具有类型,并且两个xandy都可以隐式转换为该类型,那么这就是条件表达式的类型。
这里的问题是
只有一个条件结果具有类型。这x是一个int文字,并且yisnull没有类型 并且 不能 隐式转换为 1。因此,不满足“某些好的条件”,并发生编译时错误。 null``int
int
null
null``int
有 两种 方法可以解决这个问题:
int? number = true ? (int?)5 : null;
在这里,我们仍然处于只有一个x和y具有类型的情况。请注意,null 仍然 没有类型,但编译器对此不会有任何问题,因为(int?)5并且null两者都可以隐式转换为int?(拥抱6.1.4 和拥抱6.1.5)。
(int?)5
int?
另一种方式显然是:
int? number = true ? 5 : (int?)null;
但是现在我们必须阅读规范中的 不同 条款来理解为什么这样可以:
如果x有类型X并且y有类型Y那么 如果从to存在隐式转换 (搂6.1) ,但从XtoY不存在,则是条件表达式的类型。Y``X``Y 如果从to存在隐式转换 (搂6.1) ,但从YtoX不存在,则是条件表达式的类型。X``Y``X 否则,无法确定表达式类型,并出现编译时错误。
如果x有类型X并且y有类型Y那么
X
Y
如果从to存在隐式转换 (搂6.1) ,但从XtoY不存在,则是条件表达式的类型。Y``X``Y
Y``X``Y
如果从to存在隐式转换 (搂6.1) ,但从YtoX不存在,则是条件表达式的类型。X``Y``X
X``Y``X
否则,无法确定表达式类型,并出现编译时错误。
Here xis of typeint和yis of type int?。没有从 to 的隐式转换int?,int但是有从intto的隐式转换,int?所以表达式的类型是int?。
1:进一步注意左侧的类型在确定条件表达式的类型时被忽略,这是一个常见的混淆来源。