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?

103
demandé sur Alex Jolig 2008-10-10 20:21:14

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?)

109
répondu Jason Kealey 2010-05-31 09:26:32

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;
137
répondu Jon Skeet 2017-06-10 18:24:28

Voici une édition légèrement concise de ce que Jason a suggéré:

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
19
répondu 2008-10-31 21:41:14

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 :)

19
répondu Binary Worrier 2009-01-16 15:01:58

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;

    }
}
4
répondu user2687864 2012-06-24 22:06:36

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;
        }
    }
1
répondu JStrahl 2009-10-12 18:20:09

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.

0
répondu monsieurgutix 2018-08-07 19:45:49