5

所以我才看到这行代码:

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

有没有理由不能只是:

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

5 回答 5

6

装箱空类型(C#);可以将对象直接转换为可为空的 int(但如果对象实际上不是 int,则会导致 InvalidCastException)。这两个强制转换将做的一件事是直接强制转换不会int?执行对 null 的隐式检查。

当转换为 int 然后转换为可为 null 的 int 时,如果对象变量的值为 null,则将引发 ICE。当直接转换为可为空的 int 时,可以很好地处理 null,但是如果代码随后尝试检索 Value 属性而不检查是否确实有一个,则会引发 InvalidOperationException。

这看起来像是“快速失败”的半途而废的尝试,我不会推荐它作为“好代码”。只需直接转换为可为空,然后测试 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
Item = (int?)(int)row["Item"]; 

row["Item"]如果为空,此行将引发异常。这个坏主意,不要这样做。

于 2012-10-11T18:46:43.873 回答
0

你可以使用as关键字。

Item = row["Item"] as int?; 
于 2012-10-11T18:53:29.100 回答
0

您实际上可以转换null为可为空的类型

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

不太确定这可能会导致什么异常,但我已经毫无问题地使用它。

于 2012-10-11T19:12:19.720 回答