Answers:
该规范(§7.14)说,对于条件表达式b ? x : y
,有三种可能,要么x
和y
都有一个类型和某些良好的条件得到满足,只有一个x
和y
有型和某些良好的条件得到满足,或者编译时错误发生。在这里,“一定的良好条件”意味着某些转换是可能的,我们将在下面详细介绍。
现在,我们来看一下规范的相关部分:
如果只有一个
x
与y
具有类型,都x
和y
是隐式转换为这种类型,那么这是条件表达式的类型。
这里的问题是
int? number = true ? 5 : null;
条件结果中只有一个具有类型。这里x
是一个int
文字,并且y
是null
其中没有不具有类型和null
不隐式转换为一个int
1。因此,不满足“某些良好条件”,并且会发生编译时错误。
有是解决此两种方法:
int? number = true ? (int?)5 : null;
在这里,我们仍然只有x
和y
类型之一。请注意,null
仍然没有一个类型尚未编译器不会有任何问题,这一点,因为(int?)5
和null
都是隐式转换为int?
(第6.1.4节和第6.1.5节)。
另一种方法显然是:
int? number = true ? 5 : (int?)null;
但现在我们必须阅读规范中的其他条款,以了解为什么可以这样:
如果
x
有类型X
和y
具有类型Y
,然后
如果一个隐式转换(第6.1节)从存在
X
于Y
,但不能从Y
到X
,然后Y
是条件表达式的类型。如果一个隐式转换(第6.1节)从存在
Y
于X
,但不能从X
到Y
,然后X
是条件表达式的类型。否则,将无法确定表达式类型,并且会发生编译时错误。
这x
是类型的int
,y
也是类型的int?
。没有从int?
到的隐式转换int
,但是有从到的隐式转换int
,int?
因此表达式的类型为int?
。
1:进一步注意,在确定条件表达式的类型时忽略了左侧的类型,这是此处常见的混淆源。
new int?()
到位的(int?)null
。
DateTime
,当它需要INFACT(DateTime?)
null
没有任何可识别的类型-它只需要一点点刺激就可以使其高兴:
int? number = true ? 5 : (int?)null;
int? number = true ? 5 : null as int?;
int? number = true ? 5 : (int?)null;
和int? number = true ? (int?)5 : null;
两个编译!划痕,划痕
正如其他人提到的,5是一个int
,null
不能隐式转换为int
。
以下是解决此问题的其他方法:
int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();
int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;
int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;
int? num = true ? new int?(5) : null;
另外,在您看到的任何地方int?
,都可以使用Nullable<int>
。