Crn*_*ena 4 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;
}
}
Run Code Online (Sandbox Code Playgroud)
该行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?.
这不是抛出的异常,这是一个编译器错误.前者发生在运行时,后者发生在编译时.这是一个重要的区别.
您收到此错误是因为编译器找不到接受a的扩展方法DateTime,只有一个接收DateTime?.那些是完全不同的类型.Nullable<T>没有任何继承关系T,因此你不能为Nullable<T>接受a而重载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;
}
}
Run Code Online (Sandbox Code Playgroud)
或者你可以使用DateTime.Date,它返回与你的扩展方法相同的并保留Kind,而不是上面的代码,无论输入Kind是Unspecified什么Kind.