如何使用DateTime.TryParse和Nullable <DateTime>?

我想使用DateTime.TryParse方法来获取一个string的date时间值为Nullable。 但是当我尝试这个:

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

编译器告诉我

“out”参数不被分类为variables

不知道我需要在这里做什么。 我也试过:

 out (DateTime)d.Value 

那也行不通。 有任何想法吗?

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

(可能有更优雅的解决scheme,但是为什么不简单地按照上面的方法做?)

正如杰森所说,你可以创build一个正确的types的variables,并通过它。 你可能想把它封装在你自己的方法中:

 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不同的types。 你需要编写自己的function来做到这一点,

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

希望这可以帮助 :)

编辑:删除(明显)不正确的testing扩展方法,因为(指出一些坏房子)扩展方法试图改变“这个”参数将无法与值types。

PS坏Hoor问题是一个老朋友:)

下面是Jason提出的一个稍微精简的版本:

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

那么创build一个扩展方法呢?

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

我不明白为什么微软不处理这个问题。 一个聪明的小实用方法来处理这个(我有int的问题,但用DateTimereplaceint将是相同的效果,可以是…..

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