所以我刚看到这行代码:
Item = (int?)(int)row["Item"];
它有什么理由不能成为:
Item = (int?)row["Item"];
答案 0 :(得分:6)
见Boxing Nullable Types (C#);一个对象可以直接强制转换为可以为空的int(但如果该对象实际上不是int,则会导致InvalidCastException)。直接转换为int?
的两个强制转换将执行的一件事就是对null执行隐式检查。
当转换为int然后转换为可以为null的int时,如果对象变量的值为null,则将抛出ICE。当直接转换为可以为null的int时,null处理得很好,但是如果代码然后尝试检索Value属性而不检查实际是否存在,则抛出InvalidOperationException。
这看起来像是快速失败的一半尝试,我不推荐它作为"好的代码"。只需直接转换为nullable,然后测试HasValue属性并从那里开始。
答案 1 :(得分:3)
我认为编写这行代码的正确方法是:
int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;
答案 2 :(得分:0)
Item = (int?)(int)row["Item"];
如果row["Item"]
为空,则此行抛出异常。这个坏主意,不要这样做。
答案 3 :(得分:0)
您可以使用as
关键字。
Item = row["Item"] as int?;
答案 4 :(得分:0)
您实际上可以将null
转换为可空类型
Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];
不确定这会导致什么例外,但我已经毫无问题地使用了它。