2012-10-11 34 views
5

所以我刚才看到这行代码:是否有理由将其转换为可空类型?

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

是否有一个原因,它不能仅仅是:

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

尝试一下,看看(当行[“Item”]'为'null',包含'int'或其他东西)。 – Oded

+0

@Tonnie - 考虑到'row [“Item']'包含一个'object'试图直接将它转换为一个可为空的整数是个坏主意。 –

回答

6

请参阅Boxing Nullable Types (C#);一个对象可以直接转换为一个可为空的int(但如果该对象实际上不是int,则会导致InvalidCastException)。这两个强制转换会执行的一件事情是直接转换为int?不会对null执行隐式检查。

当投射到一个int然后到一个可为空的int时,如果对象变量的值为null,则会引发ICE。当直接转换为可空int时,null处理得很好,但如果代码尝试检索Value属性而未检查实际是否存在InvalidOperationException,则将抛出InvalidOperationException。

这看起来像是一个半快速尝试“快速失败”,我不会推荐它作为“好代码”。只需直接转换为空,然后测试HasValue属性并从那里开始。

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

此行抛出的情况下,row["Item"]例外是空的。这个坏主意,不要这样做。

0

您可以使用as关键字。

Item = row["Item"] as int?; 
+0

如果'row [“Item”]''中包含的对象不是整数,则会导致InvalidCastException。此外,我不会使用任何一种方法,因为既不能像这样解决大量的继承问题。 –

+3

@Ramhound:如果对象不是整数,则'as'运算符返回'null'。 –

+0

所以,这里是大问题,'(int?)行[“项目”]'行'[“项目”]作为int?'的优点是什么? –

3

我相信写这行代码的正确方法是这样的:

int val; 
var success = int.TryParse(Convert.ToString(row["Item"]), out val); 
Item = success ? (int?)val : (int?)null; 
0

实际上,你可以投null为可空类型

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

不能确定是什么例外此可能会导致,但我用它没有问题。

相关问题