条件expression式的types不能确定,因为“int”和“null”之间没有隐式转换
为什么不能编译?
int? number = true ? 5 : null;
条件expression式的types不能确定,因为“int”和“null”之间没有隐式转换
规范(§7.14)说,条件expression式b ? x : y
b ? x : y
有三种可能性: x
和y
都有一个types,满足一定的条件 ,只有x
和y
中的一个具有types, 并且满足一定的条件 ,或者发生编译时错误。 在这里,“某些好的条件”意味着某些转换是可能的,我们将在下面详细介绍。
现在,我们来看看规范的相关部分:
如果只有一个
x
和y
有一个types,并且x
和y
都可以隐式转换为该types,那么这就是条件expression式的types。
这里的问题在于
int? number = true ? 5 : null;
只有一个条件结果有一个types。 这里x
是一个int
文字, y
是null
,它没有一个types, null
不能隐式转换为int
1 。 因此,“某些良好的条件”不符合,并发生编译时错误。
有两种方法:
int? number = true ? (int?)5 : null;
在这里,我们仍然是只有一个x
和y
有一个types的情况。 请注意, null
仍然没有types,但编译器不会有任何问题,因为(int?)5
和null
都可以隐式转换为int?
(§6.1.4和§6.1.5)。
另一种方式显然是:
int? number = true ? 5 : (int?)null;
但现在我们必须阅读规范中的不同条款来理解为什么这是好的:
如果
x
有X
型,y
有Y
型
如果存在从
X
到Y
而不是从Y
到X
的隐式转换(第6.1节),则Y
是条件expression式的types。如果存在从
Y
到X
而不是从X
到Y
的隐式转换(第6.1节),则X
是条件expression式的types。否则,不能确定expression式types,并发生编译时错误。
这里x
的types是int
, y
的types是int?
。 int?
没有隐式转换int?
int
,但是有一个从int
到int?
的隐式转换int?
所以expression式的types是int?
。
1 :还要注意,在确定条件expression式的types时忽略左侧的types,这是一个常见的混淆源。
null
没有任何可识别的types – 它只是需要一点点刺激才能使它快乐:
int? number = true ? 5 : (int?)null;