有人可以向我解释逻辑原因为什么我必须将null
强制转换为int?
当左参数类型可以同时具有两种类型?
绝对做着
int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : null);
我必须做
int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);
虽然int? k = null
完全有效。
相反的例子:
我没有必要这样做:
string k = (DateTime.Now.Ticks%5 > 3 ? "lala" : null);
答案 0 :(得分:10)
int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);
在这种情况下,我们拥有的是int
,而null
实际上是null
现在混淆是三元运算符被混淆为返回类型int
或者是null
,因为它的int
它不会接受null
所以你需要将它转换为可以为空的int
现在在另一种情况下,你有一个字符串,而string
?:运算符的第二个和第三个操作数控制的类型 条件表达式。设X和Y为第二个和第二个的类型 第三个操作数。然后,
如果X和Y的类型相同,那么这就是条件表达式的类型。
否则,如果从X到Y存在隐式转换,但不存在从Y到X的隐式转换,则Y是条件表达式的类型。
否则,如果从Y到X存在隐式转换,但不存在从X到Y的隐式转换,则X是条件表达式的类型。
否则,无法确定表达式类型,并发生编译时错误。
答案 1 :(得分:2)
因为编译器不使用左侧变量的类型来确定右侧表达式的类型。首先,它确定表达式的类型,然后确定是否可以将其放入变量中。
int
和null
值之间没有足够接近的类型。您必须使int
值为nullable或null
值为“intable”,以便编译器找到值的公共基础。
当你有string
和null
值时,编译器可以简单地使用其中一种类型,因为字符串已经可以为空。