8

可能的重复项:
可空类型和三元运算符。为什么这行不通?
具有 nullable<value> 类型的条件运算符赋值?

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

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

这工作得很好

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

6 回答 6

8

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

相反,你可以写

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

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

或者,您可以投射左侧:

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

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

于 2010-03-15T22:22:00.390 回答
4

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

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

TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null;
                                  ^^^^^^^^^^^
于 2010-03-15T22:23:25.830 回答
1

这是一个副本

可空类型和三元运算符:为什么是`?10:null`禁止?

我的回答

条件运算符不能隐式转换?

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

我还将在 4 月份写一篇关于条件运算符的类似问题的博客;观看博客了解详情。

于 2010-03-16T05:54:04.347 回答
0

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

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null);
于 2010-03-15T22:24:25.777 回答
0

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

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

我经常以这种方式使用空合并运算符。

于 2010-03-15T22:24:33.317 回答
0

这可能是您在这种情况下遇到的错误:

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

编译器正在解释它不知道如何转换nullDateTime.


使固定:

你需要which 可能返回的cast explicitly类型。这将起作用expressionnullnullable

((DateTime?) null);
于 2010-03-15T22:25:15.077 回答