首页 > 解决方案 > 有没有办法访问 Nullable.Value 不执行 Nullable.HasValue 检查?

问题描述

我有一些可以为空的值,并且希望在访问它们的值时避免异常。以下显示了我想要实现的示例。我目前有

DateTime? dt = null;
    
if(dt != null) 
{
    Console.WriteLine(dt?.ToString("yyyyMMddHHmmss"));  
}

但我已经看到可空值有一个Value属性。等价的将是

DateTime? dt = null;
    
if(dt.HasValue) 
{
    Console.WriteLine(dt.Value.ToString("yyyyMMddHHmmss")); 
}

有没有办法可以将代码简化为这样的东西?

DateTime? dt = null;
    
Console.WriteLine(dt.Value?.ToString("yyyyMMddHHmmss"));

以便它仅在.ToString("yyyyMMddHHmmss")dt为空时运行?

标签: c#

解决方案


使用模式匹配(自 c# 7.0 起),您可以编写

DateTime? dt = null;
if (dt is DateTime d) {
    Console.WriteLine(d.ToString("yyyyMMddHHmmss"));
} else {
    Console.WriteLine("dt is null");
}

这种类型模式有效,因为null没有类型并且null is T总是返回false。如果该值不为 null,则将其强制转换T并分配给dtype的新变量T

您还可以使用空属性模式(空,因为我们不想测试属性)。为了使属性模式为真,假定一个非空对象。因此,这测试not null.

if (dt is {} d) {
    // d is a non-nullable DateTime and of course dt was not null here.
}

但我必须承认,这不太可读。

也可以看看:


您还可以使用字符串插值,如果不仅仅是日期,这将特别有用。这样做的好处是您不需要测试是否dt为 null,因为您没有调用ToString

Console.WriteLine($"Date: {dt:yyyyMMddHHmmss}");

推荐阅读