Comment utiliser DateTime?TryParse avec une Nullable?
je veux utiliser le DateTime.Méthode TryParse pour obtenir la valeur datetime d'une chaîne dans une Nullable. Mais quand j'essaie ceci:
DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
le compilateur me dit
argument " out "n'est pas classé comme une variable
Je ne sais pas ce que je dois faire ici. J'ai aussi essayé:
out (DateTime)d.Value
et ça ne marche pas non plus. Des idées?
7 réponses
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;
(il pourrait y avoir des solutions plus élégantes, mais pourquoi ne pas simplement faire quelque chose comme ci-dessus?)
comme Jason le dit, Vous pouvez créer une variable du bon type et passer que. Vous souhaitez peut l'encapsuler dans votre propre méthode:
public static DateTime? TryParse(string text)
{
DateTime date;
if (DateTime.TryParse(text, out date))
{
return date;
}
else
{
return null;
}
}
... ou si vous aimez l'opérateur conditionnel:
public static DateTime? TryParse(string text)
{
DateTime date;
return DateTime.TryParse(text, out date) ? date : (DateTime?) null;
}
Ou en C# 7:
public static DateTime? TryParse(string text) =>
DateTime.TryParse(text, out var date) ? date : (DateTime?) null;
vous ne pouvez pas parce que Nullable<DateTime>
est un type différent de DateTime
.
Vous devez écrire votre propre fonction pour le faire,
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;
}
Espérons que cela aide :)
EDIT: Supprimé la méthode d'extension (évidemment) incorrectement testée, parce que (comme souligné par certains mauvais hoor) les méthodes d'extension qui tentent de changer le "ce" paramètre ne fonctionnera pas avec les Types de valeur.
P. la question est un vieil ami :)
qu'en est-il de la création d'une méthode d'extension?
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;
}
}
Je ne vois pas pourquoi Microsoft n'a pas géré cela. Une petite méthode intelligente utilitaire pour faire face à cela (j'avais le problème avec int, mais remplacer int avec DateTime sera le même effet, pourrait être.....
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;
}
}
alternativement, si vous n'êtes pas concerné par l'exception soulevée, vous pouvez changer TryParse pour Parse:
DateTime? d = DateTime.Parse("some valid text");
bien qu'il n'y aura pas de booléen indiquant le succès non plus, il pourrait être pratique dans certaines situations où vous savez que le texte d'entrée sera toujours valide.