2016-06-21 32 views
0

我正在閱讀可能有未格式化日期的字段值或空格,我需要將填充字段中的字符串轉換爲日期時間並將其寫回。我嘗試以下,但得到的錯誤「可空對象必須有一個值」:可空的日期時間轉換錯誤

DateTime? localVersion = null; 
DateTime? serverVersion = null; 

if(!string.IsNullOrWhiteSpace(item.cellValueLocal)) 
{ 
    localVersion = DateTime.ParseExact(item.cellValueLocal, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture); 
} 

if (!string.IsNullOrWhiteSpace(item.cellValueServer)) 
{ 
    serverVersion = DateTime.ParseExact(item.cellValueServer, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture); 
} 

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 

任何人都可以提供什麼問題可能會在這裏請任何指導?

+0

雖然裏面居然線路故障? – pay

+0

嘗試將它們設置爲默認值,例如DateTime? LOCALVERSION =新的日期時間(2015年,1,18);'」 – Majestic

+5

你期望發生,如果(比如)'item.cellValueLocal' *爲*空或空白? –

回答

3

如果您的cellValue爲空(或空格),那麼您的DateTime實例將不會被初始化並仍然設置爲null。您無法在無值的情況下訪問.Value可空實例。 你必須檢查與.HasValue第一:

if (localVersion.HasValue) { 
    localVersion.Value.ToString(...); 
} 
+0

這不會實際執行任何操作,因爲您沒有分配結果ToString'調用一個變量。 –

+0

@ChrisDunaway:是的。根據需要執行額外的代碼... – knittl

1

的線條:

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 

是錯誤的。如果item.cellValueLocalitem.cellValueServer爲null或空,則localVersion.ValueserverVersion.Value將永遠不會被分配一個非空值,因此,當你訪問它Value會拋出異常。

您需要更換操作:

if (localVersion.HasValue) 
    localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 

另外,您可以使用空合併運算符:

DateTime version = localVersion ?? DateTime.Now; 

用適當的默認值更換DateTime.Now。在C#6你可以使用?.語法進一步簡化它:

string version = localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) ?? String.Empty; 

這確實空校驗在線。

+0

實際上'Value'不是'null',在這種情況下,'Nullable '類型的守護程序會根據'HasValue'爲false來訪問Value。 – juharr

+0

@juharr - 夠公平的,我改了措辭。 – theB

0

如果要編譯最新版本的C#(6.0)編譯器,那麼你可以縮短這進一步爲

localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) 
+0

這不會做任何事情,因爲您沒有將「ToString」調用的結果分配給變量。 –

+0

你我知道,它反映了這個問題....這也沒有任何意義。 –