2011-10-06 6 views
13

Vorrei provare a analizzare uno string come DateTime? e, in caso di errore, impostare il valore su null. L'unico modo in cui posso pensare di farlo è il seguente, ma non sembra molto accurato.TryParse a un tipo nullable

DateTime temp; 
DateTime? whatIActuallyWant = null; 
if (DateTime.TryParse(txtDate.Text, out temp)) whatIActuallyWant = temp; 

È questo l'unico modo?

+1

Utilizzare la conversione generica http://stackoverflow.com/questions/773078/convert-string-to-nullable-type-int-double-etc –

+0

Possibile duplicato di [Generic TryParse] (http: // stackoverflow. it/questions/2961656/generic-tryparse) –

risposta

23

ne dite di questo:

DateTime? whatIActuallyWant = DateTime.TryParse(txtDate.Text, out temp) ? (DateTime?)temp : null; 

Si ottiene una battuta fuori da questo (purtroppo bisogno del DateTime? getto altrimenti non verrà compilato) - ma personalmente avrei probabilmente aderire al null inizializzazione e la successiva if - è solo più facile da leggere.

+0

Ho provato prima, ma restituisce l'errore: il tipo di espressione condizionale non può essere determinato perché non esiste una conversione implicita tra "System.DateTime" e "". – James

+0

@James: guarda il cast in 'DateTime?' - sfortunatamente è necessario perché entrambi i termini devono essere implicitamente convertibili - un'alternativa è '? temp: (DateTime?) null; ' – BrokenGlass

+0

@James, diamo un'occhiata a questo. Devi dichiarare la variabile 'temp' ancora, quindi aggiungi quella linea. Quindi abbiamo portato a 3 righe del tuo codice fino a 2. Questa versione è più o meno leggibile? Dobbiamo scorrere per vedere tutto. Più o meno complesso? Abbiamo introdotto un cast. Mezza dozzina in una mano, 6 nell'altra, se me lo chiedi. –

15

Se la vostra intenzione di eseguire questa operazione più di una volta, allora vi consiglio di aggiungere un metodo semplice estensione per la facilità d'uso ...

public static class Extensions 
{ 
    public static DateTime? ToDateTime(this string val) 
    { 
     DateTime temp; 
     if (DateTime.TryParse(val, out temp)) 
      return temp; 
     else 
      return null; 
    } 
} 

che è quindi possibile utilizzare molto facilmente ...

DateTime? ret1 = "01/01/2011".ToDateTime(); 
DateTime? ret2 = myString.ToDateTime();