Nullable DateTime-Erweiterung wirft 'nicht enthalten in definition' Ausnahme
In den folgenden code:
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;
}
}
Diese Zeile DateTime cleanDate = DateTime.Now.ToCleanDateTime();
wirft folgende exception.
'- System.DateTime' enthält keine definition für 'ToCleanDateTime'
und die beste Erweiterung Methode überladen
"Erweiterungen.ToCleanDateTime(System.DateTime?)' hat einige ungültige
Argumente
Wenn ich den Kommentar in der extension-Methode für DateTime
public static DateTime ToCleanDateTime(this DateTime dt)
Fehler wird keiner geworfen.
Könnte jemand mich aufklären mit:
- Warum dieser Fehler geworfen (abgesehen von den offensichtlichen)?
- Gibt es eine Möglichkeit, kombinieren diese zwei Erweiterungen in einer einzigen Methode?
Ich irgendwie erwartet public static DateTime? ToCleanDateTime(this DateTime? dt)
zu behandeln, sowohl DateTime
und DateTime?
.
- Wie Ihre Antwort sagt:
DateTime
! =DateTime?
weilDateTime?
sich inNullable<DateTime>
durch den compiler. Seine eine ganz andere Art.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das nicht eine Ausnahme, die ausgelöst wird, das ist ein compiler-Fehler. Der ehemalige geschieht zur Laufzeit, letztere zur compile-Zeit. Es ist ein wichtiger Unterschied.
Erhalten Sie diese Fehlermeldung, da der compiler nicht finden können, eine Erweiterung Methode der Annahme ein
DateTime
nur eine mit einemDateTime?
. Das sind völlig verschiedene Typen.Nullable<T>
hat keine vererbungsbeziehung überhauptT
, so können Sie nicht eine überlastung fürNullable<T>
akzeptierenT
, noch Umgekehrt.Können Sie kombinieren die Methoden, indem man die anderen:
Oder können Sie einfach
DateTime.Date
, der gibt den gleichen als Sie Ihre Erweiterung Methode und bewahrt dieKind
im Gegensatz zu den oben genannten code, mit demArt
wirdnicht spezifiziert
unabhängig der EingabeKind
.