繁体   English   中英

空的日期时间转换错误

[英]Nullable datetime conversion error

我正在读取可能在其中或空格中具有未格式化日期的字段值,我需要将填充字段中的字符串转换为datetime并将其写回。 我正在尝试以下操作,但收到错误“可为空的对象必须具有值”:

DateTime? localVersion = null;
DateTime? serverVersion = null;

if(!string.IsNullOrWhiteSpace(item.cellValueLocal))
{
    localVersion = DateTime.ParseExact(item.cellValueLocal, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture);
}

if (!string.IsNullOrWhiteSpace(item.cellValueServer))
{
    serverVersion = DateTime.ParseExact(item.cellValueServer, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture);
}

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);

任何人都可以就这里可能出现的问题提供任何指导吗?

如果cellValue为null(或空白),则不会初始化DateTime实例,而仍将其设置为null 您不能在没有值的可为空的实例上访问.Value 您必须先使用.HasValue进行检查:

if (localVersion.HasValue) {
  localVersion.Value.ToString(...);
}

这些行:

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);

是错误。 如果item.cellValueLocalitem.cellValueServer为null或为空,那么localVersion.ValueserverVersion.Value将永远不会被分配非null值,因此Value在您访问它时将引发异常。

您需要将操作替换为:

if (localVersion.HasValue)
    localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);

或者,您可以使用null合并运算符:

DateTime version = localVersion ?? DateTime.Now;

用适当的默认值替换DateTime.Now 在C#6中,您可以使用?. 语法以进一步简化为:

string version = localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) ?? String.Empty;

哪个执行null检查内联。

如果要编译最新版本的c#(6.0)编译器,则可以将其进一步缩短为

localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM