5

だから私はちょうどこのコード行を見ました:

Item = (int?)(int)row["Item"];

それができない理由はありますか?

Item = (int?)row["Item"];
4

5 に答える 5

6

Boxing Nullable Types(C#)を参照してください。オブジェクトはnull許容のintに直接キャストできます(ただし、オブジェクトが実際にはintでない場合は、InvalidCastExceptionが発生します)。2つのキャストが実行することの1つは、直接キャストint?が実行しないことです。これは、nullの暗黙的なチェックを実行することです。

intにキャストしてからnull許容intにキャストする場合、オブジェクト変数の値がnullの場合、ICEがスローされます。null許容整数に直接キャストする場合、nullは問題なく処理されますが、コードが実際に存在することを確認せずにValueプロパティを取得しようとすると、InvalidOperationExceptionがスローされます。

これは「速く失敗する」という中途半端な試みのように見えますが、「良いコード」としてはお勧めしません。nullableに直接キャストしてから、HasValueプロパティをテストしてそこから移動します。

于 2012-10-11T18:49:15.757 に答える
3

このコード行を記述する適切な方法は次のとおりだと思います。

int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;
于 2012-10-11T19:02:18.177 に答える
0

あなたはasキーワードを使うことができます。

Item = row["Item"] as int?; 
于 2012-10-11T18:53:29.100 に答える
0
Item = (int?)(int)row["Item"]; 

row["Item"]この行は、nullの場合に例外をスローします。この悪い考え、やらないでください。

于 2012-10-11T18:46:43.873 に答える
0

実際にnullnull許容型としてキャストできます

Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];

これによりどのような例外が発生するかはよくわかりませんが、問題なく使用しています。

于 2012-10-11T19:12:19.720 に答える