[英]Nullable DateTime used in property with expression returns unexpected default value
我有以下两个方法扩展:
public static class DateTimeConverter
{
public static DateTime? Convert(this DateTime? time) =>
time != null
? new DateTime(time.Value.Ticks) :
default;
}
还有一个:
public static class DateTimeConverterExplicit
{
public static DateTime? Convert(this DateTime? time) =>
time != null
? new DateTime(time.Value.Ticks) :
(DateTime ?)default;
}
运行以下代码时:
DateTime? dateTime = default;
var first = DateTimeConverter.Convert(dateTime);
var second = DateTimeConverterExplicit.Convert(dateTime);
Console.WriteLine($"First: {first}");
Console.WriteLine($"Second: {second}");
我得到以下 output:
First: 1-1-0001 00:00:00
Second:
我想知道为什么 C# 认为它应该在使用第一个DateTimeConverter
时返回 DateTime 的默认值(而不是Nullable<DateTime>
的默认值)。 当我明确将其转换为DateTime?
默认值符合预期。
当我重写第一个如下:
public static DateTime? Convert(this DateTime? time)
{
if (time != null)
{
return new DateTime(time.Value.Ticks);
}
else
{
return default;
}
}
它也可以按预期工作。 所以不知何故 C# 无法确定正确的类型。 有谁知道为什么会这样?
三元表达式中使用的类型的规则是两个子表达式必须是相同的类型,或者其中一个类型必须是另一个的合法目标类型。
在第一种方法中,您的两个子表达式是DateTime
,而不是DateTime?
. 这里的default
从另一个子表达式中获取类型,因此变为DateTime
,它不从目标、 return
语句以及方法返回类型中获取类型。
相反,三元表达式被评估为DateTime
,然后这个值被默默地提升为DateTime?
,但是伤害已经造成了。
在您的最后一个示例中,使用两个return
语句, default
从方法中获取所需的类型,因为它在return
语句中使用,并变为DateTime?
,而在另一个return
语句中, DateTime
值再次被默默地提升为DateTime?
.
除了 Lasse 的回答之外,我只想与您分享如何在 Visual Studio 中自己查找它。
在您的第一个示例中,您可以编写default(DateTime)
而不是仅default
并且注意 Visual Studio 会告诉您可以省略DateTime
并且您应该只编写default
。
但是当你写default(DateTime?)
Visual Studio 不会产生提示。
这告诉您,仅写入default
会生成DateTime
object 而不是DateTime?
.
或者您可以简单地将鼠标悬停在default
关键字上,它会提供一个工具提示,告诉它代表什么System.DateTime
,而不是System.Nullable<T>
,其中T
是DateTime
。
现在您知道default
结果是DateTime
应该很明显,恕我直言,为什么它显示MinValue
而不是null
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.