我正在读取可能在其中包含未格式化日期或空格的字段值,我需要将填充字段中的字符串转换为datetime并将其写回。我正在尝试以下但是得到错误“Nullable对象必须有一个值”:
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);
任何人都可以提供有关此问题的指导吗?
答案 0 :(得分:3)
如果您的cellValue为null(或空格),则不会初始化DateTime实例,仍然会将其设置为null
。如果没有值,则无法在可空的实例上访问.Value
。
您必须先查看.HasValue
:
if (localVersion.HasValue) {
localVersion.Value.ToString(...);
}
答案 1 :(得分:1)
行:
localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
是错误。如果item.cellValueLocal
或item.cellValueServer
为空或为空,则localVersion.Value
和serverVersion.Value
永远不会被赋予非空值,因此Value
将抛出异常你可以访问它。
您需要将操作替换为:
if (localVersion.HasValue)
localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
或者,您可以使用空合并运算符:
DateTime version = localVersion ?? DateTime.Now;
使用适当的默认值替换DateTime.Now
。在C#6中,您可以使用?.
语法将其进一步简化为:
string version = localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) ?? String.Empty;
null检查内联。
答案 2 :(得分:0)
如果您正在编译最新版本的c#(6.0)编译器,那么您可以将其进一步缩短为
localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)