A. *_*son 13 c# sql boxing casting
我们有一些代码将数据从Microsoft Access数据库存档到MS SQL Server数据库中.假设我们已经从Access表填充了数据读取器,并且我们正在为SqlCommand添加一个参数以准备插入,我们有一个失败的类型转换.这是代码:
oSqlServerDbCmd_ForInsert.Parameters.AddWithValue("@Duration",
(int) oReader["Duration"]);
Run Code Online (Sandbox Code Playgroud)
oReader中的字段实际上是一个Access Integer,它是C#的简称.如果我们在这里投短,那就没问题了.但是,如果我们转换为int,则代码会抛出InvalidCastException.我可能会误解MSDN文档:
"有一个预定义的从short到int,long,float,double或decimal的隐式转换."
...但听起来这应该有效(我的理由是,如果定义了隐式转换,为什么显式类型转换不起作用?).我意识到转换甚至不是必需的,因为AddWithValue接受了一个对象,所以我们实际上已经从我们的代码中移除了转换,但我希望看到一个解释为什么这个转换失败,以防万一我们遇到这样的事情未来.
你必须转换为非常特定的类型,因为你是拆箱 - 问题是oReader["Duration"]返回一个object实例:
short myShort = 42;
object o = myShort;
int myInt = (int)o; //fails
Run Code Online (Sandbox Code Playgroud)
如果你先回到short,然后再转到int,它会成功:
(int) (short) oReader["Duration"]
Run Code Online (Sandbox Code Playgroud)