可为空DateTime参数调用ToString报错的原因及格式化解决方法
问题
我编写了如下函数:
private static string strTimeStampMsg(string strMsg, DateTime? dtTimestamp = null) { if (strMsg == null || strMsg.Length == 0) { return string.Empty; } string strDateTime; if (dtTimestamp != null) { strDateTime = dtTimestamp.ToString(CSTR.dtFormat); } else { strDateTime = DateTime.Now.ToString(CSTR.dtFormat); } return strDateTime + "> " + strMsg; }
其中CSTR.dtFormat是DLL中定义的常量:
public const string dtFormat = "dd-MM-yyyy HH:mm:ss.fff";
添加可选参数后,strDateTime = dtTimestamp.ToString(CSTR.dtFormat);这行的ToString出现红色下划线,请问原因是什么?如何在保留指定格式的前提下解决该问题?
原因分析
dtTimestamp是可空类型DateTime?(即Nullable<DateTime>),该类型本身没有提供接受格式字符串的ToString(string)重载方法。改成可空类型后,直接调用ToString(string)会找不到匹配的方法,因此出现编译错误(红色下划线)。
解决方法
以下几种方式都能在保留指定格式的前提下解决问题:
方式一:访问Value属性
由于已经通过if (dtTimestamp != null)做了非空判断,直接访问Value属性获取实际的DateTime值后调用ToString:
strDateTime = dtTimestamp.Value.ToString(CSTR.dtFormat);
方式二:强制类型转换
将可空DateTime?强制转换为DateTime类型后调用ToString:
strDateTime = ((DateTime)dtTimestamp).ToString(CSTR.dtFormat);
方式三:简化逻辑(C# 6.0+)
如果项目支持C# 6.0及以上版本,可以用空传播运算符合并if-else逻辑,代码更简洁:
string strDateTime = dtTimestamp?.ToString(CSTR.dtFormat) ?? DateTime.Now.ToString(CSTR.dtFormat);
内容的提问来源于stack exchange,提问作者SPlatten
相关产品推荐
相关产品推荐

