null和datetime之间没有隐式转换

Nai*_*air 17 c#

以下代码从给定DataRow(modelValue)读取一个数据并将其解析为nullable DateTime实例.

问题:请查看L1 & L2两者在技术上相同的代码部分(如果我没有发生任何小学生错误).但是,L1按预期工作但不是L2.我正进入(状态

null和datetime之间没有隐式转换

当我执行下面的代码时L2.有人可以告诉我吗?

        DateTime? CallBack;

        var callBackDate = modelValue["CallBack"] == DBNull.Value ? null : modelValue["CallBack"].ToString();
        //Parsing
        DateTime cdate;
        if (!DateTime.TryParse(callBackDate, out cdate))
            cdate = DateTime.MinValue;


        //L1
        if (cdate==DateTime.MinValue)
            CallBack = null;
        else
           CallBack = cdate.Date;

       //L2  
       CallBack = cdate == DateTime.MinValue?null:cdate.Date;
Run Code Online (Sandbox Code Playgroud)

dca*_*tro 27

(Z) ? X : Y
Run Code Online (Sandbox Code Playgroud)

三元运算符要求从第二个操作数(X)到第三个操作数(Y)或从Y到X存在隐式转换.

由于null不能被隐式转换为DateTime,也不DateTimenull,表达不能被评价.更多相关内容:Eric Lippert的类型推断问题.

你要投nullDateTime?.通过这样做,X将是类型DateTime?,Y将是类型DateTime.由于存在从DateTimeto 的隐式转换DateTime?,因此可以计算表达式,并且它将返回type的值DateTime?.

或者,按照相同的逻辑,您也可以将第三个操作数Y转换为DateTime?.


Jak*_*cki 13

您需要告诉编译器将null视为DateTime?。否则,编译器将不知道是什么类型null

CallBack = cdate == DateTime.MinValue ? (DateTime?)null : cdate.Date;


Tim*_*ter 5

为什么不首先使用DataRow.Field支持可为空类型的扩展方法?

DateTime? CallBack = modelValue.Field<DateTime?>("CallBack");
Run Code Online (Sandbox Code Playgroud)

但由于您实际上有一string列,因此您需要先解析它:

DateTime? CallBack = null;
string callBackDate = modelValue.Field<string>("CallBack");
if(!string.IsNullOrWhiteSpace(callBackDate))
{
    DateTime cdate;
    if(DateTime.TryParse(callBackDate, out cdate))
        CallBack = cdate;
}
Run Code Online (Sandbox Code Playgroud)

就这样。