Answers:
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;
Parse
希望它返回DateTime
并在失败时引发异常的人,对吗?但是是的,您可以做任何您想做的事...在Noda Time中,我已经命名了相关方法Parse
。
else
关键字是不必要的(在第一个例子),因为的终点if
块永远不能达到。
这是Jason建议的简短版本:
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;
}
希望这可以帮助 :)
编辑: 删除了(显然)未正确测试的扩展方法,因为(试图指出“糟糕”的扩展方法)尝试更改“ this”参数的扩展方法不适用于值类型。
PS有问题的坏家伙是老朋友:)
如何创建扩展方法?
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;
}
}
dateTime
是什么?从未使用过。
DateTime? TryParse(this string dateString)
。这种实现方式很奇怪。
(DateTime?).TryParse( ... )
或Nullable<DateTime>.TryParse( ... )
。所以Mike Z是对的,这是该方法的愚蠢签名。
这是您正在寻找的一种衬板:
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;
}
}
或者,如果您不担心引发的异常,则可以将TryParse更改为Parse:
DateTime? d = DateTime.Parse("some valid text");
尽管也没有布尔值指示成功,但是在某些情况下,当您知道输入文本将始终有效时,这可能是可行的。