2011-10-06 9 views
13

Me gustaría intentar analizar un string como DateTime?, y si falla, establezca el valor en null. La única forma en que puedo pensar para hacer esto es lo siguiente, pero no parece muy claro.TryParse a un tipo que admite nulos

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

¿Es esta la única manera?

+1

Considere utilizar la conversión genérica http://stackoverflow.com/questions/773078/convert-string-to-nullable-type-int-double-etc –

+0

Posible duplicado de [TryParse genérico] (http: // stackoverflow. com/questions/2961656/generic-tryparse) –

Respuesta

23

¿Qué tal esto:

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

Usted recibe una sola línea fuera de este (por desgracia necesita el elenco DateTime? de otro modo no se compilará) - pero personalmente probablemente se adhieren a la null inicialización y la posterior if - es simplemente más fácil de leer.

+0

Intenté esto antes, pero vuelve el error: el tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre 'System.DateTime' y ''. – James

+0

@James: ver el elenco a 'DateTime?' - lamentablemente es necesario porque ambos términos deben ser implícitamente convertibles - ¿una alternativa es '? temp: (DateTime?) null; ' – BrokenGlass

+0

@James, veamos esto. Debes declarar la variable 'temp' aún, así que agrega esa línea. Así que hemos reducido 3 líneas de tu código a 2. ¿Es esta versión más o menos legible? Tenemos que desplazarnos para verlo todo. Más o menos complejo? Presentamos un elenco. Media docena en una mano, 6 en la otra, si me preguntas. –

15

Si vas a estar realizando esta operación más de una vez entonces me recomiendan la adición de un método simple extensión para facilitar su 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; 
    } 
} 

que luego se puede utilizar muy fácilmente ...

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