C# 如何将DateTime.TryParse与可为空的<;日期时间>;?
我想使用DateTime.TryParse方法将字符串的DateTime值转换为可空值。但当我尝试这个:C# 如何将DateTime.TryParse与可为空的<;日期时间>;?,c#,datetime,nullable,C#,Datetime,Nullable,我想使用DateTime.TryParse方法将字符串的DateTime值转换为可空值。但当我尝试这个: DateTime? d; bool success = DateTime.TryParse("some date text", out (DateTime)d); 编译器告诉我 “out”参数未归类为变量 不知道我需要在这里做什么。我也试过: out (DateTime)d.Value 这也不管用。有什么想法吗 DateTime? d=null; DateTime d2; bool s
DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
编译器告诉我
“out”参数未归类为变量
不知道我需要在这里做什么。我也试过:
out (DateTime)d.Value
这也不管用。有什么想法吗
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中:
您不能这样做,因为
Nullable
与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;
}
public bool TryParse(字符串文本,输出可空数据)
{
日期时间日期;
bool isParsed=DateTime.TryParse(文本,过期);
如果(isParsed)
n数据=新的可空数据(日期);
其他的
nDate=新的可空();
返回已分配;
}
希望这有帮助:)
编辑:
删除了(显然)测试不正确的扩展方法,因为(正如一些坏的hoor所指出的)尝试更改“this”参数的扩展方法无法处理值类型
注:问题中的坏胡尔是一位老朋友:)以下是杰森建议的略显简洁的版本:
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更改为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;
你说得对,我一直在寻找更多的一行程序来完成它,但我想这样就可以了。不喜欢创建临时变量,感觉很混乱。-/似乎应该更好地支持这种情况。请参阅Binary Worrier的建议,将它嵌入扩展方法。为什么要将DateTime强制转换为DateTime?你没有在将d2传递到TryParse之前需要对其进行重述。@Slace--我更新了答案以纳入您的建议。@Jason Kealey我希望这已经在VS2012中引入,否则我将不得不继续使用这段好代码。您不想初始化日期[因为您将其用作out参数]好的,我不再挑剔了!我身上没有编译器,但由于DateTime是一种值类型,扩展方法def compile吗?结果不会返回,除非您确定--[TestFixture]公共类在处理{[Test]public void TryParseShouldWork()时返回{DateTime?x=null;var res=Externders.TryParse(x,“1/1/1990”);Assert.IsTrue(res);Assert.That(x!=null);}在Assert上失败。也就是说,结果不会因为DateTime而被修改,这是一种值类型(在手机屏幕上总是一个很好的剔除问题:D)(obv是第一个)(不延期)一个可以工作,但它应该是out,而不是ref-如果它不能与TryXXX API相匹配,你应该将结果置零-很确定FDG提到了这一点。伙计,我很挑剔!第一个参数,dateTime
,是干什么的?它从来没有被使用过。@mikez-扩展方法就是这样工作的,编译器使用它来知道它的应该是一个扩展方法。@MystereMan我知道扩展方法是什么。更合适的扩展方法签名应该是DateTime?TryParse(这个字符串是dateString)
。这个实现太奇怪了。@mikez-那你为什么问它是干什么的?为什么只在datetime中使用字符串名称空间?目的是提供一个与datetime.TryParse(即datetime)的模拟?。TryParse@ErikFunkenbusch此扩展方法不允许像(DateTime?).TryParse这样的调用语法(…)
或Nullable.TryParse(…)
。所以mike z是对的,这是一个愚蠢的方法签名。我可能不应该与Skeet争论,但是…你应该调用你的方法Parse,因为我希望名为TryParse的方法遵循TryParse约定并返回布尔值。;-)@迈斯特:在这两种情况下,它都没有完全遵循现有的惯例——那些习惯于Parse
的人会期望它返回DateTime
,并在失败时抛出异常,对吗?但是,是的,你可以做任何你想做的事情……在野田佳彦,我将相关的方法命名为Parse
yword是不必要的(在您的第一个示例中),因为永远无法到达if
块的终点。@JeppeStigNielsen:是的,它是不必要的-但它可能在风格上更适合对称性。这只是个人偏好(我也不一致…)@Kiquenet:使用else可以更清楚地表明,将采用一条或另一条路径,并且两条路径都会返回。我反对大规模嵌套代码,但在这种情况下,我认为这真的不是问题。@robnick这与我所说的有什么不同?忽略我之前的评论(我对你的解决方案投了赞成票!),对于最新的C#我需要将null:DateTime?d=DateTime.TryParse(blah,out-DateTime dt)?dt:(DateTime?)转换为null;那么…你只是在4个月后复制了我的答案?
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;
}
}