web-dev-qa-db-fra.com

Comment utiliser DateTime.TryParse avec un <DateTime> Nullable?

Je souhaite utiliser la méthode DateTime.TryParse pour obtenir la valeur datetime d'une chaîne dans Nullable. Mais quand j'essaye ceci:

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

le compilateur me dit 

L'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?

104
Brian Sullivan
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?)

112
Jason Kealey

Comme le dit Jason, vous pouvez créer une variable du bon type et la transmettre. Vous voudrez peut-être 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;
143
Jon Skeet

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
Sonny

Vous ne pouvez pas parce que Nullable<DateTime> est d'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;
}

J'espère que cela t'aides :)

EDIT: Suppression de la méthode d'extension (évidemment) incorrectement testée car les méthodes d'extension (comme indiqué par certains bad hoor) qui tentent de modifier le paramètre "this" ne fonctionneront pas avec les types de valeur.

P.S. Le Bad Hoor en question est un vieil ami :)

19
Binary Worrier

Qu'en est-il de créer 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
user2687864

Je ne vois pas pourquoi Microsoft ne s'en est pas occupé. Une méthode peu astucieuse pour faire face à ce problème (j'avais le problème avec int, mais remplacer int par DateTime aurait 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
JStrahl

Sinon, si vous n'êtes pas concerné par l'éventuelle exception levée, vous pouvez modifier TryParse pour Parse:

DateTime? d = DateTime.Parse("some valid text");

Bien qu'il n'y ait pas non plus de booléen indiquant le succès, cela peut être pratique dans certaines situations où vous savez que le texte saisi sera toujours valide.

0
monsieurgutix