所以我才看到这行代码:
Item = (int?)(int)row["Item"];
有没有理由不能只是:
Item = (int?)row["Item"];
所以我才看到这行代码:
Item = (int?)(int)row["Item"];
有没有理由不能只是:
Item = (int?)row["Item"];
见装箱空类型(C#);可以将对象直接转换为可为空的 int(但如果对象实际上不是 int,则会导致 InvalidCastException)。这两个强制转换将做的一件事是直接强制转换不会int?
执行对 null 的隐式检查。
当转换为 int 然后转换为可为 null 的 int 时,如果对象变量的值为 null,则将引发 ICE。当直接转换为可为空的 int 时,可以很好地处理 null,但是如果代码随后尝试检索 Value 属性而不检查是否确实有一个,则会引发 InvalidOperationException。
这看起来像是“快速失败”的半途而废的尝试,我不会推荐它作为“好代码”。只需直接转换为可为空,然后测试 HasValue 属性并从那里开始。
我相信编写这行代码的正确方法是:
int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;
Item = (int?)(int)row["Item"];
row["Item"]
如果为空,此行将引发异常。这个坏主意,不要这样做。
你可以使用as
关键字。
Item = row["Item"] as int?;
您实际上可以转换null
为可为空的类型
Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];
不太确定这可能会导致什么异常,但我已经毫无问题地使用它。