Ich möchte die DateTime.TryParse-Methode verwenden, um den datetime-Wert eines Strings in eine Nullable zu bekommen. Aber wenn ich das versuche:
DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
Der Compiler sagt es mir
Das Argument 'out' wird nicht als Variable klassifiziert
Ich bin mir nicht sicher, was ich hier tun muss. Ich habe auch versucht:
out (DateTime)d.Value
und das funktioniert auch nicht. Irgendwelche Ideen?
Wie Jason sagt, können Sie eine Variable des richtigen Typs erstellen und diese übergeben. Möglicherweise möchten Sie es in Ihrer eigenen Methode kapseln:
... oder wenn Ihnen der bedingte Operator gefällt:
Oder in C # 7:
quelle
Parse
erwartet hatten, dass es zurückkehrtDateTime
und eine Ausnahme bei einem Fehler auslöst , oder? Aber ja, Sie können tun, was Sie wollen ... und in Noda Time habe ichParse
stattdessen die relevanten Methoden benannt .else
Schlüsselwort ist (in Ihrem ersten Beispiel) nicht erforderlich, da der Endpunkt desif
Blocks niemals erreicht werden kann.Hier ist eine leicht prägnante Ausgabe dessen, was Jason vorgeschlagen hat:
quelle
Sie können nicht, weil
Nullable<DateTime>
es sich um einen anderen Typ handeltDateTime
. Sie müssen Ihre eigene Funktion schreiben, um es zu tun,Hoffe das hilft :)
BEARBEITEN: Die (offensichtlich) nicht ordnungsgemäß getestete Erweiterungsmethode wurde entfernt, da Erweiterungsmethoden, die versuchen, den Parameter "this" zu ändern, mit Werttypen nicht funktionieren.
PS Das fragliche Bad Hoor ist ein alter Freund :)
quelle
Was ist mit dem Erstellen einer Erweiterungsmethode?
quelle
dateTime
? Es wird nie benutzt.DateTime? TryParse(this string dateString)
. Diese Implementierung ist nur bizarr.(DateTime?).TryParse( ... )
oderNullable<DateTime>.TryParse( ... )
. Also ist Mike Z richtig, das ist eine dumme Signatur für die Methode.Ich verstehe nicht, warum Microsoft damit nicht umgegangen ist. Eine clevere kleine Dienstprogrammmethode, um damit umzugehen (ich hatte das Problem mit int, aber das Ersetzen von int durch DateTime wird den gleichen Effekt haben, könnte sein .....
quelle
Dies ist der einzige Liner, für den Sie suchen:
Wenn Sie es zu einer geeigneten TryParse-Pseudoerweiterungsmethode machen möchten, können Sie dies tun:
quelle
Hier ist eine einzeilige Lösung:
quelle
Wenn Sie sich nicht mit der möglichen Ausnahme befassen, können Sie alternativ TryParse for Parse ändern:
Obwohl es auch keinen Booleschen Wert gibt, der den Erfolg anzeigt, kann dies in einigen Situationen praktisch sein, in denen Sie wissen, dass der Eingabetext immer gültig ist.
quelle