だから私はちょうどこのコード行を見ました:
Item = (int?)(int)row["Item"];
それができない理由はありますか?
Item = (int?)row["Item"];
だから私はちょうどこのコード行を見ました:
Item = (int?)(int)row["Item"];
それができない理由はありますか?
Item = (int?)row["Item"];
Boxing Nullable Types(C#)を参照してください。オブジェクトはnull許容のintに直接キャストできます(ただし、オブジェクトが実際にはintでない場合は、InvalidCastExceptionが発生します)。2つのキャストが実行することの1つは、直接キャストint?
が実行しないことです。これは、nullの暗黙的なチェックを実行することです。
intにキャストしてからnull許容intにキャストする場合、オブジェクト変数の値がnullの場合、ICEがスローされます。null許容整数に直接キャストする場合、nullは問題なく処理されますが、コードが実際に存在することを確認せずにValueプロパティを取得しようとすると、InvalidOperationExceptionがスローされます。
これは「速く失敗する」という中途半端な試みのように見えますが、「良いコード」としてはお勧めしません。nullableに直接キャストしてから、HasValueプロパティをテストしてそこから移動します。
このコード行を記述する適切な方法は次のとおりだと思います。
int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;
あなたはas
キーワードを使うことができます。
Item = row["Item"] as int?;
Item = (int?)(int)row["Item"];
row["Item"]
この行は、nullの場合に例外をスローします。この悪い考え、やらないでください。
実際にnull
null許容型としてキャストできます
Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];
これによりどのような例外が発生するかはよくわかりませんが、問題なく使用しています。