我正在尝试检查DateTime
变量"starttime"
和"endtime"
是否有null
值,然后尝试初始化为empty
值,如下所示,但我遇到了编译错误。实现这一目标的最佳方法是什么?
string htmllink = "";
DateTime? starttime = null;
DateTime? endtime = null;
htmllink = (dbNullCheck.isColumnNull(rdr, "html_link")) ? "" : rdr.GetString(3);
starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? "" : rdr.GetString(4);
endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? "" : rdr.GetString(5);
results.htmllist.Add(new gethtmllist() { resulthtmllink = htmllink,
duration = (starttime - endtime).ToString() });
错误:
错误2无法将类型'string'隐式转换为'System.DateTime?'
更新: -
string htmllink = "";
htmllink = (dbNullCheck.isColumnNull(rdr, "html_link")) ? "" : rdr.GetString(3);
DateTime? starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? new DateTime() : rdr.GetDateTime(4);
DateTime? endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? new DateTime() : rdr.GetDateTime(5);
results.htmllist.Add(new gethtmllist()
{
resulthtmllink = htmllink,
duration = starttime.HasValue && endtime.HasValue ? (endtime.Value - starttime.Value).ToString() : ""
});
答案 0 :(得分:1)
问题似乎是您尝试将starttime
和endtime
设置为字符串值,当您最初将它们声明为DateTime?
类型时。要解决此问题,您需要将它们声明为字符串以开始,或者在赋值期间将值转换为有效的DateTime?
类型。
DateTime? starttime = (dbNullCheck.isColumnNull(rdr, "start_time"))
? null
: rdr.GetDateTime(4);
DateTime? endtime = (dbNullCheck.isColumnNull(rdr, "end_time"))
? null
: rdr.GetDateTime(5);
然后,当您计算持续时间时,您可能需要检查空值(或HasValue
的{{1}})。我还更改了操作数的顺序,以便从DateTime?
中减去starttime
(否则您可能会有endtime
的负数):
duration
答案 1 :(得分:1)
您无法将日期设置为字符串
loaded_epoch = sess.run(global_step)//(batch_size*num_train_records)
应该是
starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? "" : rdr.GetString(4);
endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? "" : rdr.GetString(5);
答案 2 :(得分:1)
请使用DateTime.Parse
方法将字符串转换为有效的DateTime
对象。
使用DateTime?
之类的Nullable Types时,您应该使用HasValue
属性检查是否存在值,要获取值,请使用Value
属性。
string htmllink = "";
htmllink = (dbNullCheck.isColumnNull(rdr, "html_link")) ? "" : rdr.GetString(3);
DateTime? starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? default(DateTime?) : DateTime.Parse(rdr.GetString(4));
DateTime? endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? (DateTime?)null : DateTime.Parse(rdr.GetString(5));
results.htmllist.Add(new gethtmllist() { resulthtmllink = htmllink,
duration = starttime.HasValue && endtime.HasValue ? (starttime.Value - endtime.Value).ToString() : "there is no duration" });
为了在具有可空类型的trenary表达式中使用null
,请记住使用(DateTime?)null
或default(DateTime?)
将其强制转换为预期类型。请参阅why this is needed。
答案 3 :(得分:1)
我尝试使用string.Empty来测试:starttime = string.IsNullOrEmpty(str) ? (DateTime?)null : DateTime.Now;
它成功了。所以你的代码可能是:
starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? (DateTime?)null : rdr.GetDateTime(4);
endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? (DateTime?)null: rdr.GetDateTime(5);
更新1: string.Empty的.Net小提琴示例:Link