我们有一些代码将数据从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接受一个对象,因此我们实际上已经从代码中删除了强制转换,但是我很乐意看到一个解释,说明这种强制转换失败的原因,以防万一我们遇到这样的情况。未来。
您手中拥有的是 拆箱 的实例。特别是在取消装箱时,您只能将装箱到最初装箱的值的类型;如果该类型是A,并且您要取消对B的装箱操作, 则是否存在从A到B的隐式转换都没关系 (取消装箱仍将失败)。
有关相关说明,请参见Eric Lippert关于该主题的经典博客文章。