Подтвердить что ты не робот

Как использовать DateTime.TryParse с Nullable <DateTime>?

Я хочу использовать метод DateTime.TryParse, чтобы получить значение datetime строки в Nullable. Но когда я пробую это:

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

компилятор говорит мне

Аргумент

'out' не классифицируется как переменная

Не уверен, что мне нужно делать здесь. Я также пробовал:

out (DateTime)d.Value 

и это тоже не работает. Любые идеи?

4b9b3361

Ответ 1

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

(Могут быть более элегантные решения, но почему бы вам просто не сделать что-то, как указано выше?)

Ответ 2

Как говорит Джейсон, вы можете создать переменную правильного типа и передать ее. Возможно, вы захотите инкапсулировать его в свой собственный метод:

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

... или если вам нужен условный оператор:

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

Или в С# 7:

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

Ответ 3

Вот немного сжатое издание того, что предложил Джейсон:

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

Ответ 4

Вы не можете, потому что Nullable<DateTime> отличается от DateTime. Вам нужно написать свою собственную функцию, чтобы сделать это,

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

Надеюсь, что это поможет:)

EDIT: Удалено (явно) неправильно протестированный метод расширения, потому что методы расширения (как указано в некоторых неправильных hoor), которые пытаются изменить параметр "this", не будут работать со значениями типов.

P.S. Бад-Хор в вопросе - старый друг:)

Ответ 5

Как создать метод расширения?

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;

    }
}

Ответ 6

Я не понимаю, почему Microsoft не справилась с этим. Умный маленький метод утилиты для решения этой проблемы (у меня была проблема с int, но замена int на DateTime будет тем же самым эффектом, может быть.....

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

Ответ 7

Это тот лайнер, который вы ищете для:

DateTime? d = DateTime.TryParse("some date text", out DateTime dt) ? dt : null;

Если вы хотите, чтобы это был правильный метод псевдо-расширения TryParse, вы можете сделать это:

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

Ответ 8

В качестве альтернативы, если вас не волнует возможное возникшее исключение, вы можете изменить TryParse для Parse:

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

Хотя логическое значение, указывающее на успех, также не будет, это может быть полезно в некоторых ситуациях, когда вы знаете, что вводимый текст всегда будет действительным.