以下代码从给定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,也不DateTime到null,表达不能被评价.更多相关内容:Eric Lippert的类型推断问题.
你要投null给DateTime?.通过这样做,X将是类型DateTime?,Y将是类型DateTime.由于存在从DateTimeto 的隐式转换DateTime?,因此可以计算表达式,并且它将返回type的值DateTime?.
或者,按照相同的逻辑,您也可以将第三个操作数Y转换为DateTime?.
Jak*_*cki 13
您需要告诉编译器将null视为DateTime?。否则,编译器将不知道是什么类型null。
CallBack = cdate == DateTime.MinValue ? (DateTime?)null : cdate.Date;
为什么不首先使用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)
就这样。