Как использовать DateTime.TryParse с Nullable?
Я хочу использовать DateTime.TryParse метод, чтобы получить значение datetime строки в Nullable. Но когда я пробую это:
DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
компилятор говорит мне
аргумент " out " не классифицируется как переменная
Не уверен, что мне нужно сделать здесь. Я также пробовал:
out (DateTime)d.Value
и это тоже не работает. Есть идеи?
7 ответов
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;
(могут быть более элегантные решения, но почему бы вам просто не сделать что-то, как указано выше?)
как говорит Джейсон, вы можете создать переменную правильного типа и передать ее. Возможно, вы захотите инкапсулировать его в свой собственный метод:
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;
}
или C# 7:
public static DateTime? TryParse(string text) =>
DateTime.TryParse(text, out var date) ? date : (DateTime?) null;
вот немного concised издания о том, что Джейсон предложил:
DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
вы не можете, потому что 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", не будут работать с типами значений.
С. П. плохих Хур на вопрос старого друга :)
Как насчет создания метода расширения?
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;
}
}
Я не понимаю, почему 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;
}
}
кроме того, если вас не волнует возможное исключение, вы можете изменить TryParse для Parse:
DateTime? d = DateTime.Parse("some valid text");
хотя не будет логического указания на успех, это может быть практично в некоторых ситуациях, когда вы знаете, что входной текст всегда будет действительным.