为什么条件运算符没有正确地允许使用“null”来赋值为可空类型?

时间:2010-03-15 22:18:57

标签: c# .net nullable conditional-operator

  

可能重复:
  Nullable types and the ternary operator. Why won’t this work?
  Conditional operator assignment with nullable<value> types?

这将无法编译,说明“无法确定条件表达式的类型,因为'System.DateTime'和''”之间没有隐式转换

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : null;

这很好用

 if (TextBoxActualEndDate.Text != "")
    task.ActualEndDate = DateTime.Parse(TextBoxActualEndDate.Text);
else
    task.ActualEndDate = null;

6 个答案:

答案 0 :(得分:8)

这不起作用,因为编译器不会同时在双方插入隐式转换,而null需要隐式转换才能成为可空类型。

相反,你可以写

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?();

这只需要一次隐式转换(DateTimeDateTime?)。

或者,您可以施放左侧:

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)DateTime.Parse(TextBoxActualEndDate.Text) : null;

这也只需要一次隐式转换。

答案 1 :(得分:4)

条件运算符不会查看返回值的内容。它只查看要求它们选择的值:DateTime和null。它不能将这些标识为相同类型的实例(因为null不是有效的DateTime),因此错误。你和我知道Nullable<DateTime>可以完成这项工作,但不允许条件运算符引入“更大”的类型:它只允许查看它们之间选择的两个表达式的类型。 (感谢Aaronaught在评论中澄清这一点以及一个很好的澄清示例。)

要解决此问题,请通过强制转换DateTime为操作员提供一个提示:

TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null;
                                  ^^^^^^^^^^^

答案 2 :(得分:1)

这是

的副本

Nullable types and the ternary operator: why is `? 10 : null` forbidden?

我对

的回答

Conditional operator cannot cast implicitly?

给出了与此问题密切相关的分析。

我还将在4月份与条件运营商发表关于类似问题的博客;观看博客了解详情。

答案 3 :(得分:0)

原因是null的类型为object,因此您必须将其强制转换为正确的类型,如下所示:

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null);

答案 4 :(得分:0)

最正确的方法(IMO)就是这样做

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text) : null);

我经常以这种方式使用null collaescing运算符。

答案 5 :(得分:0)

这可能是你在这种情况下得到的错误:

  

错误CS0173:条件类型   表达无法确定   因为没有隐含的   ''和'int'之间的转换)

编译器正在解释它不知道如何将null转换为DateTime


<强>修正:

您需要cast explicitly expression可能会将null返回nullable类型。这将有效

((DateTime?) null);