c# - getvalueordefault - ¿Cómo uso DateTime.TryParse con un<DateTime> Nullable?
get datetime c# null (6)
Quiero utilizar el método DateTime.TryParse para obtener el valor datetime de una cadena en un valor Nullable. Pero cuando pruebo esto:
DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
el compilador me dice
el argumento ''fuera'' no se clasifica como una variable
No estoy seguro de lo que tengo que hacer aquí. También lo intenté:
out (DateTime)d.Value
y eso tampoco funciona ¿Algunas ideas?
¿Qué tal crear un método de extensión?
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;
}
}
Aquí hay una edición ligeramente conciso de lo que Jason sugirió:
DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
Como dice Jason, puedes crear una variable del tipo correcto y pasar eso. Es posible que desee encapsularlo 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;
No puede porque Nullable<DateTime>
es un tipo diferente a DateTime
. Necesita 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 :)
EDITAR: Se eliminó el método de extensión (obviamente) incorrectamente probado, porque (como se señala en algunos puntos negativos) los métodos de extensión que intentan cambiar el parámetro "este" no funcionarán con los Tipos de valores.
PD: El Bad Hoor en cuestión es un viejo amigo :)
No veo por qué Microsoft no manejó esto. Un pequeño y inteligente método de utilidad para manejar esto (tuve el problema con int, pero reemplazar int con DateTime tendrá 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;
}
}
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é simplemente no haces algo como el anterior?)