3
DateTime? testDate = (DateTime?)arrayOfObjects[dateObject];

そのコードは大丈夫ですか?演算子を使用しようとしましたasが、「null 不可」エラーが発生しました。私が言おうとしているのは、配列から選択しているオブジェクトはどちらDateTimeかであるということですnull DateTimeが、どちらも testDate に割り当てることができます。

このようにするのは正しくないと思います。明らかな何かが欠けていると思います。

編集:次の方法で適応できた方法と同じだと思いますas:

DateTime? testDate = arrayOfObjects[dateObject] as DateTime?;

どちらのコード行が、潜在的な null を処理する最良の方法ですか?

4

4 に答える 4

4

どちらのコード行が潜在的な null を処理する最良の方法ですか?

null2 番目の形式は、配列に DateTime 以外のものが含まれている場合に暗黙のうちに発生します。これは、最初のものを使用する正当な理由のようです。

基本的な質問に:

私は何かを見逃していますか、それともこれは典型的な(または少なくとも許容できる)アプローチですか

受け入れられますが、ボックス化解除操作を「隠している」ため、少しわかりにくいかもしれません。
あなたが使用することができます:

DateTime? testDate = null;
if (arrayOfObjects[dateObject] != null)  
   testDate = (DateTime) arrayOfObjects[dateObject];  // no '?'

しかし、それは冗長です。?:そして、この特定の問題は、条件演算子 ( )には適していません。

だから私はあなたの最初のバージョンに固執します.

于 2012-06-28T14:24:56.607 に答える
2

日付時刻?別の構造体の短縮形です

Nullable<DateTime> {
    bool HasValue;
    DateTime Value;
}

DB からこの型を取得することはないため、最初の行が正しくキャストされることはありません。データベースは、オブジェクト変数に格納された DateTime 値を提供します。または null (型なし)。

DateTime は構造体であるため、"as" 演算子は機能しません。したがって、次のように単純に null をチェックします。

DateTime? testDate = arrayOfObjects[dateObject] == null ? (DateTime?) null : (DateTime)arrayOfObjects[dateObject];
于 2012-06-28T14:31:14.740 に答える
0

より良いアプローチは、次のようなことです。

if(arrayOfObjects[dateObject] != null && arrayOfObjects[dateObject] is DateTime)
{
  DateTime testDate = (DateTime)arrayOfObjects[dateObject];
  // logic here
}

または次のようなもの:

DateTime? testDate = null;
if(arrayOfObjects[dateObject] is DateTime)
{
    testDate = (DateTime)arrayOfObjects[dateObject];
} 
else if (arrayOfObjects[dateObject] is Nullable<DateTime>) 
{
    testDate = (Nullable<DateTime>)arrayOfObjects[dateObject];
}
于 2012-06-28T14:22:00.677 に答える
-1

Array.ConvertAllメソッドを使用してみてください。以下は、おおよその実装方法です。

DateTime?[] dates = Array.ConvertAll<object, DateTime?>arrayOfObjects,DateTime);  

注:これは大まかなアイデアです。自分に合うように修正できます。

于 2012-06-28T14:29:42.487 に答える