如何使用带有 Nullable < DateTime > 的 DateTime.TryParse?

我想使用日期时间。方法将字符串的 datetime 值获取到 Nullable 中。但是当我试着这样做的时候:

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

编译器告诉我

“ out”参数不属于变量

我不知道该怎么办,我也试过:

out (DateTime)d.Value

那也没用,有什么办法吗?

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

(可能有更优雅的解决方案,但为什么不像上面那样简单地做一些事情呢?)

正如 Jason 所说,您可以创建一个正确类型的变量并传递它。您可能需要用自己的方法封装它:

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;

你不能,因为 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;
}

希望这对你有帮助:)

编辑: 删除了(显然)测试不当的扩展方法,因为(正如一些糟糕的程序员指出的)试图更改“ this”参数的扩展方法不能与 Value Type 一起工作。

附注: 这个坏门神是我的一个老朋友

以下是杰森建议的略为简明的版本:

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

我不明白为什么微软没有处理这个问题。一个聪明的小实用程序方法来处理这个问题(我曾经遇到过 int 的问题,但是用 DateTime 替换 int 会产生相同的效果,可以是... ..。

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

创建扩展方法怎么样?

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;


}
}

或者,如果不关心可能引发的异常,可以更改 TryParse for Parse:

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

虽然也不会有一个布尔值来表示成功,但是在某些情况下,它可能是实用的,因为您知道输入文本将始终是有效的。

这就是你要找的一条线索:

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

这里有一个单行解决方案:

DateTime? d = DateTime.TryParse("text", out DateTime parseDate) ? parseDate : (DateTime?)null;