当变量类型为[int?]时,为什么必须在C#中转换为(int?)

时间:2013-02-07 08:03:26

标签: c# .net

有人可以向我解释逻辑原因为什么我必须将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);

2 个答案:

答案 0 :(得分:10)

int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);

在这种情况下,我们拥有的是int,而null实际上是null 现在混淆是三元运算符被混淆为返回类型int或者是null,因为它的int它不会接受null

所以你需要将它转换为可以为空的int

现在在另一种情况下,你有一个字符串,而string

完全可以接受null

可以在Type inference - Eric

找到进一步的解释
  

?:运算符的第二个和第三个操作数控制的类型   条件表达式。设X和Y为第二个和第二个的类型   第三个操作数。然后,

     
      
  • 如果X和Y的类型相同,那么这就是条件表达式的类型。

  •   
  • 否则,如果从X到Y存在隐式转换,但不存在从Y到X的隐式转换,则Y是条件表达式的类型。

  •   
  • 否则,如果从Y到X存在隐式转换,但不存在从X到Y的隐式转换,则X是条件表达式的类型。

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

  •   

答案 1 :(得分:2)

因为编译器不使用左侧变量的类型来确定右侧表达式的类型。首先,它确定表达式的类型,然后确定是否可以将其放入变量中。

intnull值之间没有足够接近的类型。您必须使int值为nullable或null值为“intable”,以便编译器找到值的公共基础。

当你有stringnull值时,编译器可以简单地使用其中一种类型,因为字符串已经可以为空。