Nullable DateTime扩展抛出'不包含定义'异常

时间:2015-05-28 18:33:38

标签: c# datetime nullable

在下面的代码中:

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();抛出以下异常。

  

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

如果我在DateTime public static DateTime ToCleanDateTime(this DateTime dt)的扩展方法中发表评论,则不会抛出错误。

任何人都可以通过以下方式启发我:

  1. 为什么抛出这个错误(除了显而易见的)?
  2. 有没有办法将这两个扩展组合成单一方法?
  3. 我不知何故希望public static DateTime? ToCleanDateTime(this DateTime? dt)同时处理DateTimeDateTime?

2 个答案:

答案 0 :(得分:6)

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

您收到此错误是因为编译器无法找到接受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 will be Unspecified,无论输入是什么? s Kind

答案 1 :(得分:0)

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