0

私のコード:

DateTime? birthDate = DateTime.Parse(filterDictionary.ContainsKey("DOB") ? filterDictionary["DOB"] : string.Empty);

「文字列が有効な日時として認識されませんでした」というエラーメッセージが表示されます。この問題を解決する方法。ありがとう。

4

2 に答える 2

2

問題(少なくとも1つ)は、空の文字列をに解析できないことですDateTime

コードの行を次のように変更して、キーが見つかった場合にのみ解析を移動し、キーがない場合は解析ではなくnullを返します。

DateTime? birthDate = filterDictionary.ContainsKey("DOB") ? DateTime.Parse( filterDictionary["DOB"]) : (DateTime?) null;

もう1つの問題は、辞書のDOB値を実際にに変換できないことDateTimeです。上記のコードが機能しない場合は、質問を編集して、filterDictionary["DOB"]このエラーが発生したときに値を投稿してください。

于 2012-10-19T06:12:04.300 に答える
1

空の文字列を提示するDateTime.Parseと、常に失敗します。

これを見たのは、辞書にデータがあったのに無効だったのか、データがなくて解析しているのかは明らかではありませstring.Empty。また、はではなく、をDateTime.Parse返すことに注意してください。エントリが辞書にない場合の値にしたい場合は、実際に次を使用します。DateTimeDateTime?null

DateTime? birthDate = null;
string dobText;
if (filterDictionary.TryGetValue("DOB", out dobText))
{
    birthDate = DateTime.Parse(dobText);
}

多分:

string dobText;
DateTime? birthDay = filterDictionary.TryGetValue("DOB", out dobText)
    ? DateTime.Parse(dobText) : (DateTime?) null;

nullコンパイラが条件式の型を計算できるように、ここに2番目または3番目のオペランドの少なくとも1つをキャストする必要があることに注意してください。

また、への単純な呼び出しDateTime.Parseが適切かどうかを検討する必要があります。

  • 期待している特定の形式がわかっている場合は、DateTime.ParseExact
  • これがユーザー入力の場合は、おそらくTryParseまたはを使用する必要がありますTryParseExact
  • ユーザー入力でない場合は、おそらく次の構文解析カルチャを指定する必要があります。CultureInfo.InvariantCulture
  • GUIでの直接のユーザー入力の場合、そもそもテキストとして取得しないようにする方法はありますか?
于 2012-10-19T06:14:12.877 に答える