You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可为空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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:22:33