我想使用DateTime.TryParse方法将字符串的datetime值变为Nullable。但是当我尝试这个时:
DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
编译器告诉我
'out'参数未被归类为变量
不确定我需要在这做什么。我也试过了:
out (DateTime)d.Value
这也不起作用。有什么想法吗?
答案 0 :(得分:148)
正如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;
答案 1 :(得分:115)
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;
(可能会有更优雅的解决方案,但为什么不简单地按上述方式执行操作?)
答案 2 :(得分:19)
您不能,因为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”参数的扩展方法不适用于值类型。
P.S。有问题的Bad Hoor是一位老朋友:)
答案 3 :(得分:19)
这是Jason建议的一个略微简洁的版本:
DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
答案 4 :(得分:4)
如何创建扩展方法?
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;
}
}
答案 5 :(得分:1)
我不明白微软为什么不处理这个问题。一个聪明的小实用工具方法来解决这个问题(我遇到了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;
}
}
答案 6 :(得分:1)
这是您正在寻找的班轮:
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;
}
}
答案 7 :(得分:1)
这是单行解决方案:
DateTime? d = DateTime.TryParse("text", out DateTime parseDate) ? parseDate : (DateTime?)null;
答案 8 :(得分:-1)
或者,如果您不担心可能引发的异常,则可以将TryParse更改为Parse:
DateTime? d = DateTime.Parse("some valid text");
尽管也不会表示成功的布尔值,但是在某些情况下,当您知道输入文本将始终有效时,这可能是可行的。