转换为类型再转换为可空类型有什么原因吗?

5

我刚刚看到了这行代码:

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

有没有特殊原因不能简单地这样写:

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

1
尝试一下并查看(当 row["Item"]null,包含一个 int 或其他内容时)。 - Oded
@Tonnie - 考虑到 row["Item"] 包含一个 object,试图直接将其转换为可空整数是一个不好的想法。 - Security Hound
5个回答

6
请参见Boxing Nullable Types (C#)。一个对象可以直接转换为可空整数(但如果该对象实际上不是整数,则会导致InvalidCastException)。两个转换所做的唯一一件事情,而直接转换为int?不会执行隐式检查null。
当将变量转换为整数然后转换为可空整数时,如果对象变量的值为null,则会抛出ICE。当直接转换为可空整数时,null可以很好地处理,但是如果代码尝试在没有检查是否有Value属性的情况下检索它,则会抛出InvalidOperationException。
这看起来像是一种“快速失败”的不完美尝试,我不建议将其作为“良好的代码”。只需直接转换为可空类型,然后测试HasValue属性并从那里继续即可。

3
我认为编写这行代码的正确方式是这样的:
int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;

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

如果row["Item"]为空,这一行代码会抛出异常。这是一个不好的做法,请勿这样做。


0

你可以使用as关键字。

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

如果row["Item"]中的对象不是整数,这可能会导致InvalidCastException异常。此外,我不会使用任何一种方法,因为它们都无法解决像这样强制转换所带来的许多问题。 - Security Hound
3
如果对象不是整数,as运算符会返回null - Michael Liu
那么,这里有一个重要的问题,(int?)row["Item"] 相对于 row["Item"] as int? 有什么优势? - Michael Earls

0

你实际上可以将 null 强制转换为可空类型

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

我不太确定这可能会引起什么异常,但我已经使用它而没有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接