2016-06-21 16 views
0

書式設定されていない日付または空白を持つ可能性のあるフィールド値を読み込んでいます。フィールドの文字列をdatetimeに変換して書き戻す必要があります。私は、次のことをしようとしているが、エラーは、「NULL可能オブジェクトが値を持たなければなりません」を取得:Null可能な日時変換エラー

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 = new DateTime(2015、1、18); '' – Majestic

+5

' item.cellValueLocal' *が空白または空白の場合、どうなると思いますか? –

答えて

3

cellValueがnull(または空白)の場合、DateTimeインスタンスは初期化されず、nullに設定されます。値のない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.cellValueLocalまたはitem.cellValueServerがnullまたは空の場合、localVersion.ValueおよびserverVersion.Valueにはnull値が割り当てられないため、アクセスするとValueが例外をスローします。

DateTime version = localVersion ?? DateTime.Now; 

適切なデフォルト値でDateTime.Nowの交換:

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

はまた、あなたがnull合体演算子を使用することができます。

あなたがして操作を交換する必要があります。ヌルチェックをインラインで行い

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

:C#6では、に、さらにそれを簡素化するために?.構文を使用することができます。

+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

私は知っている、質問をミラーリングしています...何もしません。 –