2011-10-06 56 views
13

我想尝试解析string作为DateTime?,如果失败,则将值设置为null。我能想到做到这一点的唯一方法是以下几点,但看起来并不太整齐。TryParse为可空类型

DateTime temp; 
DateTime? whatIActuallyWant = null; 
if (DateTime.TryParse(txtDate.Text, out temp)) whatIActuallyWant = temp; 

这是唯一的方法吗?

+1

考虑使用通用转换http://stackoverflow.com/questions/773078/convert-string-to-nullable-type-in​​t-double-etc –

+0

可能重复[通用TryParse](http:// stackoverflow。 com/questions/2961656/generic-tryparse) –

回答

23

如何:

DateTime? whatIActuallyWant = DateTime.TryParse(txtDate.Text, out temp) ? (DateTime?)temp : null; 

你得到一个班轮出这(不幸的是需要DateTime?投,否则将无法编译) - 但我个人可能会坚持到null初始化和随后的if - 阅读起来很简单。

+0

我之前试过,但它返回错误:条件表达式的类型无法确定,因为'System.DateTime'和''之间没有隐式转换。 – James

+0

@James:将演员视为DateTime? - 不幸的是它是必要的,因为这两个词都必须是隐式可转换的 - 另一种是“? temp:(DateTime?)null;' – BrokenGlass

+0

@James,让我们来看看这个。你必须声明'temp'变量,所以添加那行。所以我们已经将你的代码的三行减少到了2.这个版本或多或少具有可读性?我们必须滚动才能看到这一切。或多或少复杂?我们已经推出了演员阵容。如果你问我,一只手打六打,另一只手打六打。 –

15

如果你将要执行此操作不止一次那么我建议增加对易用性的一个简单的扩展方法更多...

public static class Extensions 
{ 
    public static DateTime? ToDateTime(this string val) 
    { 
     DateTime temp; 
     if (DateTime.TryParse(val, out temp)) 
      return temp; 
     else 
      return null; 
    } 
} 

然后你可以使用很容易...

DateTime? ret1 = "01/01/2011".ToDateTime(); 
DateTime? ret2 = myString.ToDateTime();