c# – 为什么这个从short到int失败?

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

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

来自oReader的字段实际上是一个Access Integer,它是C#中的一个简写.如果我们在这里投下一短,没有问题.但是,如果我们转换为int,则代码将抛出一个InvalidCastException异常.我可能会从MSDN documentation

“从short到int,long,float,double或decimal都有一个预定义的隐式转换.”

…但是这听起来应该是有效的(我的推理是,如果隐式转换定义为什么显式类型转换不起作用).我意识到cast不是必需的,因为AddWithValue接受一个对象,所以我们实际上从我们的代码中删除了cast,但是我很想看到一个解释,为什么这个演员失败了,以防我们遇到这样的事情未来.

您手中的是unboxing的一个实例.具体来说,在取消装箱时,您只能取消装箱的原始盒装类型;如果该类型为A,并且您对B进行取消装箱,则不存在从A到B的隐式转换(拆箱仍将失败).

有关这个问题,请参阅Eric Lippert的classic blog post.

翻译自:https://stackoverflow.com/questions/9741788/why-does-this-cast-from-short-to-int-fail

转载注明原文:c# – 为什么这个从short到int失败?