所以我刚才看到这行代码:是否有理由将其转换为可空类型?
Item = (int?)(int)row["Item"];
是否有一个原因,它不能仅仅是:
Item = (int?)row["Item"];
所以我刚才看到这行代码:是否有理由将其转换为可空类型?
Item = (int?)(int)row["Item"];
是否有一个原因,它不能仅仅是:
Item = (int?)row["Item"];
请参阅Boxing Nullable Types (C#);一个对象可以直接转换为一个可为空的int(但如果该对象实际上不是int,则会导致InvalidCastException)。这两个强制转换会执行的一件事情是直接转换为int?
不会对null执行隐式检查。
当投射到一个int然后到一个可为空的int时,如果对象变量的值为null,则会引发ICE。当直接转换为可空int时,null处理得很好,但如果代码尝试检索Value属性而未检查实际是否存在InvalidOperationException,则将抛出InvalidOperationException。
这看起来像是一个半快速尝试“快速失败”,我不会推荐它作为“好代码”。只需直接转换为空,然后测试HasValue属性并从那里开始。
Item = (int?)(int)row["Item"];
此行抛出的情况下,row["Item"]
例外是空的。这个坏主意,不要这样做。
您可以使用as
关键字。
Item = row["Item"] as int?;
如果'row [“Item”]''中包含的对象不是整数,则会导致InvalidCastException。此外,我不会使用任何一种方法,因为既不能像这样解决大量的继承问题。 –
@Ramhound:如果对象不是整数,则'as'运算符返回'null'。 –
所以,这里是大问题,'(int?)行[“项目”]'行'[“项目”]作为int?'的优点是什么? –
我相信写这行代码的正确方法是这样的:
int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;
实际上,你可以投null
为可空类型
Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];
不能确定是什么例外此可能会导致,但我用它没有问题。
尝试一下,看看(当行[“Item”]'为'null',包含'int'或其他东西)。 – Oded
@Tonnie - 考虑到'row [“Item']'包含一个'object'试图直接将它转换为一个可为空的整数是个坏主意。 –