Come utilizzo DateTime.TryParse con un Nullable?

Voglio usare il metodo DateTime.TryParse per ottenere il valore datetime di una stringa in un Nullable. Ma quando provo questo:

DateTime? d; bool success = DateTime.TryParse("some date text", out (DateTime)d); 

il compilatore mi dice

L’argomento ‘out’ non è classificato come variabile

Non sono sicuro di cosa ho bisogno di fare qui. Ho anche provato:

 out (DateTime)d.Value 

e anche questo non funziona. Qualche idea?

 DateTime? d=null; DateTime d2; bool success = DateTime.TryParse("some date text", out d2); if (success) d=d2; 

(Potrebbero esserci soluzioni più eleganti, ma perché non fai semplicemente qualcosa come sopra?)

Come dice Jason, puoi creare una variabile del tipo giusto e superarla. Potresti incapsularlo nel tuo metodo:

 public static DateTime? TryParse(string text) { DateTime date; if (DateTime.TryParse(text, out date)) { return date; } else { return null; } } 

… o se ti piace l’operatore condizionale:

 public static DateTime? TryParse(string text) { DateTime date; return DateTime.TryParse(text, out date) ? date : (DateTime?) null; } 

Oppure in C # 7:

 public static DateTime? TryParse(string text) => DateTime.TryParse(text, out var date) ? date : (DateTime?) null; 

Non puoi perché Nullable è un tipo diverso da DateTime . Devi scrivere la tua funzione per farlo,

 public bool TryParse(string text, out Nullable nDate) { DateTime date; bool isParsed = DateTime.TryParse(text, out date); if (isParsed) nDate = new Nullable(date); else nDate = new Nullable(); return isParsed; } 

Spero che questo ti aiuti 🙂

EDIT: Rimosso il metodo di estensione (ovviamente) testato in modo errato, perché (come sottolineato da alcuni cattivi hoor) i metodi di estensione che tentano di cambiare il parametro “this” non funzioneranno con i Value Type.

PS Il cattivo Hoor in questione è un vecchio amico 🙂

Ecco un’edizione leggermente concisa di ciò che Jason ha suggerito:

 DateTime? d; DateTime dt; d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null; 

Che ne pensi di creare un metodo di estensione?

 public static class NullableExtensions { public static bool TryParse(this DateTime? dateTime, string dateString, out DateTime? result) { DateTime tempDate; if(! DateTime.TryParse(dateString,out tempDate)) { result = null; return false; } result = tempDate; return true; } } 

Non vedo perché Microsoft non ha gestito questo. Un piccolo e intelligente metodo di utilità per gestire questo problema (ho avuto il problema con int, ma sostituire int con DateTime sarà lo stesso effetto, potrebbe essere …..

  public static bool NullableValueTryParse(string text, out int? nInt) { int value; if (int.TryParse(text, out value)) { nInt = value; return true; } else { nInt = null; return false; } } 

In alternativa, se non ti interessa la ansible eccezione sollevata, puoi modificare TryParse per Parse:

 DateTime? d = DateTime.Parse("some valid text"); 

Sebbene non ci sia un valore booleano che indica il successo, potrebbe essere pratico in alcune situazioni in cui si sa che il testo di input sarà sempre valido.