2011-10-06 64 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();