为什么从short到int的转换失败

本文关键字:转换 失败 int short 为什么 | 更新日期: 2023-09-27 18:28:07

我们有一些代码可以将数据从Microsoft Access数据库归档到MS SQL Server数据库中。假设我们已经从Access表中填充了一个数据读取器,并且我们正在向SqlCommand添加一个参数以准备插入,那么我们的类型转换将失败。这是代码:

oSqlServerDbCmd_ForInsert.Parameters.AddWithValue("@Duration",
     (int) oReader["Duration"]);

oReader中的字段实际上是一个Access Integer,它是C#中的一个缩写。如果我们在这里投一个空头,就没有问题。但是,如果我们将类型转换为int,则代码将抛出InvalidCastException。我可能误解了MSDN文档中的内容:

有一个预定义的从short到int、long、float、double或decimal的隐式转换

但这听起来应该有效(我的理由是,如果定义了隐式转换,为什么显式类型转换不起作用?)。我意识到强制转换甚至没有必要,因为AddWithValue接受一个对象,所以我们实际上已经从代码中删除了强制转换,但我很想看到一个解释,解释为什么这个强制转换失败,以防我们将来遇到这样的情况。

为什么从short到int的转换失败

您手中的是开箱的一个实例。特别是在取消装箱时,您只能取消装箱到最初装箱的值的类型;如果该类型为A并且您正在取消装箱到B,则是否存在从A到B的隐式转换无关紧要(取消装箱仍将失败)。

请参阅Eric Lippert关于这个主题的经典博客文章,了解相关的解释。

由于您正在开箱,因此必须强制转换为非常特定的类型-问题是oReader["Duration"]返回一个object实例:

short myShort = 42;
object o = myShort;
int myInt = (int)o; //fails

如果你先投回short,然后投回int:,它就会成功

(int) (short) oReader["Duration"]