可能重复:
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;
答案 0 :(得分:8)
这不起作用,因为编译器不会同时在双方插入隐式转换,而null
需要隐式转换才能成为可空类型。
相反,你可以写
task.ActualEndDate = TextBoxActualEndDate.Text != "" ?
DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?();
这只需要一次隐式转换(DateTime
到DateTime?
)。
或者,您可以施放左侧:
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);