2008-10-10 13 views
98

Quiero utilizar el método DateTime.TryParse para obtener el valor de fecha y hora de una cadena en un valor Nullable. Pero cuando intento esto:¿Cómo uso DateTime.TryParse con un Nullable <DateTime>?

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

el compilador me dice

'hacia fuera' argumento no es clasificada como una variable

No está seguro de lo que tengo que hacer aquí. También lo intenté:

out (DateTime)d.Value 

y eso tampoco funciona. ¿Algunas ideas?

Respuesta

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

(Puede haber soluciones más elegantes, pero ¿por qué no simplemente hacer algo que el anterior?)

+3

Tienes razón, estaba buscando más de una línea para hacerlo, pero supongo que sí. No me gusta crear esa variable de temperatura, me siento desordenado.: -/Parece esto el escenario debería ser mejor soportado. –

+1

vea la sugerencia de Binary Worrier de poner en línea psuedo eso en un método de extensión. –

+4

¿Por qué está transfiriendo un DateTime a un DateTime? No necesita reinstalar d 2 antes de pasarlo al TryParse. –

127

Como dice Jason, puede crear una variable del tipo adecuado y pasar eso. Es posible que desee encapsular en su propio método:

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

... o si te gusta el operador condicional:

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

O en C# 7:

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

Probablemente no debería discutir con The Skeet, pero ... deberías llamar a tu método Parse, ya que esperaría que un método llamado TryParse siguiera la convención TryParse y devolviese un booleano. ;-) – Myster

+0

@Myster: Bueno, en ninguno de los casos sigue la convención existente: aquellos acostumbrados a '' Parse' esperarían que devolviera 'DateTime' y arrojarían una excepción en caso de falla, ¿no? Pero sí, puedes hacer lo que quieras ... y en Noda Time, he nombrado los métodos relevantes 'Parse' en su lugar. –

+0

La palabra clave 'else' no es necesaria (en su primer ejemplo) ya que nunca se puede llegar al punto final del bloque' if'. –

19

Puede 't porque Nullable<DateTime> es un tipo diferente a DateTime. Usted tiene que escribir su propia función para hacerlo,

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

Espero que esto ayude :)

EDIT: ha eliminado el método de extensión (obviamente) inadecuadamente probado, porque (como se ha señalado por algunos bad hoor) los métodos de extensión que intentan cambiar el parámetro "this" no funcionarán con Value Types.

P.S. Lo malo Hur en cuestión es un viejo amigo :)

+0

Ya no quieres iniciar la fecha [ya que lo estás utilizando como un param] OK, ¡dejaré de ser exigente! –

+0

No tengo un compilador, pero como DateTime es un tipo de valor, ¿el método de extensión def compila? –

+0

El resultado no viene de vuelta a menos que sea a cabo - [TestFixture] clase pública WhenExtending { [Test] public void TryParseShouldWork() { DateTime? x = nulo; var res = Externders.TryParse (x, "1/1/1990"); Assert.IsTrue (res) –

16

Aquí está una edición ligeramente concised de lo que sugirió Jason:

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

no veo por qué Microsoft no manejar esto. Un método de utilidad poco inteligente como para hacer frente a este (tuve el problema con int, pero sustituyendo int con DateTime será el mismo efecto, podría ser .....

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; 
     } 
    } 
+0

Innecesario *** else ***. https://blog.codinghorror.com/flattening-arrow-code/ – Kiquenet

4

¿Qué pasa con la creación de un método de extensión?

+2

¿Para qué sirve ese primer parámetro, 'dateTime'? Nunca se usa. –

+1

@mikez - así es como funcionan los métodos de extensión, el compilador lo usa para saber que debe ser un método de extensión. –

+3

@MystereMan Sé lo que es un método de extensión. Una firma más apropiada para un método de extensión sería 'DateTime? TryParse (esta cadena dateString) '. Esta implementación es simplemente extraña. –

Cuestiones relacionadas