我想使用DateTime.TryParse方法将字符串转换为可空的日期时间值。但是当我尝试这样做时:
DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
编译器告诉我:
“out”参数未被归类为变量。
不确定我需要在这里做什么。 我也尝试过:
out (DateTime)d.Value
还有一个问题,那个方法也不起作用。你有什么想法吗?
正如Jason所说,您可以创建一个正确类型的变量并传递它。您可能希望将其封装在自己的方法中:
就像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;
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;
(可能还有更优雅的解决方案,但为什么不像上面那样简单地做呢?)
这是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”参数的扩展方法将无法与值类型一起使用。
P.S. 相关的坏人是我老朋友 :)
这就是您正在寻找的一行代码:
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?
,是吗? - James Skempif (DateTime.TryParse("some date text", out DateTime dt) { d = dt }
- mochsnerpublic 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
是用来干什么的?它从未被使用过。 - Mike ZborayDateTime? TryParse(this string dateString)
。这个实现方式太奇怪了。 - Mike Zboray(DateTime?).TryParse( ... )
或者Nullable<DateTime>.TryParse( ... )
这样的调用语法。所以Mike Z是对的,这个方法的签名很愚蠢。 - Jeppe Stig NielsenDateTime? d = DateTime.TryParse("text", out DateTime parseDate) ? parseDate : (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;
}
}
或者,如果你不关心可能引发的异常,你可以将TryParse更改为Parse:
DateTime? d = DateTime.Parse("some valid text");
虽然也不会有一个布尔值指示成功,但在某些情况下,这可能是实用的,特别是当您知道输入文本始终有效时。
return null;
避免 Arrowhead anti-patternelse { return null; }
。查看链接:https://blog.codinghorror.com/flattening-arrow-code/ - Kiquenet