gpt4 book ai didi

c# - 在带有表达式的属性中使用的可空 DateTime 返回意外的默认值

转载 作者:行者123 更新时间:2023-12-04 01:26:50 24 4
gpt4 key购买 nike

我有以下两个方法扩展:

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}");

我得到以下输出:

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 这里 picks up 来自其他子表达式的类型,因此变成 DateTime,它不从目标中选择类型, return 语句和方法返回类型。

取而代之的是,三元表达式被评估为 DateTime,然后这个值被默默地提升为 DateTime?,但损害已经造成。

在你的最后一个例子中,有两个 return 语句,default 从方法中获取所需的类型,因为它被用于 return 语句,并变为 DateTime?,而在另一个 return 语句中,DateTime 值再次被静默提升为 DateTime?.

关于c# - 在带有表达式的属性中使用的可空 DateTime 返回意外的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61748464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com