可空DateTime扩展抛出'不包含定义'例外

本文关键字:包含 定义 例外 DateTime 可空 扩展 | 更新日期: 2023-09-27 17:51:05

在下面的代码中:

void Main()
{
    DateTime cleanDate = DateTime.Now.ToCleanDateTime();    
    DateTime? nullableCleanDate = DateTime.Now;
    nullableCleanDate = nullableCleanDate.ToCleanDateTime();
    cleanDate.Dump();
    nullableCleanDate.Dump();
}
public static class Extensions
{
    //public static DateTime ToCleanDateTime(this DateTime dt)
    //{
    //  dt = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0);
    //  return dt;
    //}
    public static DateTime? ToCleanDateTime(this DateTime? dt)
    {
        if (dt.HasValue)
            dt = new DateTime(dt.Value.Year, dt.Value.Month, dt.Value.Day, 0, 0, 0, 0);
        return dt;
    }
}

DateTime cleanDate = DateTime.Now.ToCleanDateTime();行抛出以下异常。

"系统。DateTime'不包含ToCleanDateTime'的定义而最好的扩展方法是重载'Extensions.ToCleanDateTime(System.DateTime?)'有一些无效参数

如果我在DateTime的扩展方法中注释public static DateTime ToCleanDateTime(this DateTime dt)错误不会抛出。

谁能告诉我:

  1. 为什么这个错误抛出(除了明显的)?
  2. 是否有办法将这两个扩展合并为一个方法?

我期望public static DateTime? ToCleanDateTime(this DateTime? dt)同时处理DateTimeDateTime?

可空DateTime扩展抛出'不包含定义'例外

这不是一个抛出的异常,这是一个编译器错误。前者发生在运行时,后者发生在编译时。这是一个重要的区别。

你得到这个错误是因为编译器找不到一个接受DateTime的扩展方法,只有一个接受DateTime?的扩展方法。它们是完全不同的类型。Nullable<T>T没有任何继承关系,因此不能使Nullable<T>的重载接受T,反之亦然。

你可以通过让一个调用另一个来组合这两个方法:

public static class Extensions
{
    public static DateTime ToCleanDateTime(this DateTime dt)
    {
      return new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0);      
    }
    public static DateTime? ToCleanDateTime(this DateTime? dt)
    {
        if (dt.HasValue)
        {
            return dt.Value.ToCleanDateTime();
        }
        return dt;
    }
}

或者您可以只使用DateTime.Date,它返回与您的扩展方法相同的结果并保留Kind,与上述代码相反,Kind无论输入的Kind都将是Unspecified

如果dt的数据类型为DateTime?,您可以使用dt.value.Month和dt.Value.Year等来获取数据