是否有理由将其转换为可归类型?

时间:2012-10-11 18:43:09

标签: c# casting type-conversion

所以我刚看到这行代码:

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

它有什么理由不能成为:

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

5 个答案:

答案 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"];

不确定这会导致什么例外,但我已经毫无问题地使用了它。