在下面的代码中:
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)
的扩展方法中发表评论,则不会抛出错误。
任何人都可以通过以下方式启发我:
我不知何故希望public static DateTime? ToCleanDateTime(this DateTime? dt)
同时处理DateTime
和DateTime?
。
答案 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 等来获取数据