![c# – 为什么我不能将一个smallint从MSSQL转换为int,如下所示:int x =(int)dt.Rows [x] [“smallIntColumn”],第1张 c# – 为什么我不能将一个smallint从MSSQL转换为int,如下所示:int x =(int)dt.Rows [x] [“smallIntColumn”],第1张](/aiimages/c%23+%E2%80%93+%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%B8%8D%E8%83%BD%E5%B0%86%E4%B8%80%E4%B8%AAsmallint%E4%BB%8EMSSQL%E8%BD%AC%E6%8D%A2%E4%B8%BAint%2C%E5%A6%82%E4%B8%8B%E6%89%80%E7%A4%BA%EF%BC%9Aint+x+%3D%28int%29dt.Rows+%5Bx%5D+%5B%E2%80%9CsmallIntColumn%E2%80%9D%5D.png)
//this line works OKint i = Convert.ToInt32(dt.Rows[x]["SmallintColumnname"]);//this line errors outint j = (int)dt.Rows[x]["SmallintColumnname"];
我发现这很奇怪,但我想有一个有效的论据,说明为什么会这样.
谢谢.
编辑:
您好@damIEn_The_UnbelIEver – 它是InvalIDCastException – 指定的强制转换无效.
我想我需要阅读拳击和拆箱.我认为两者都有效.
现在我刚试过:
int k = (Int32)r_dtAttribute.Rows[x]["CultureID"];
这也失败了同样的InvalIDCastException – 所以任何人都可以告诉我它们之间的实际差异
//failsint k = (Int32)r_dtAttribute.Rows[x]["CultureID"];
和
//worksint i = Convert.ToInt32(dt.Rows[x]["SmallintColumnname"]);
Convert.ToInt32函数做什么只是用(Int32)进行转换不行?
谢谢
解决方法 dt.Rows [x] [“SmallintColumnname”]将返回一个对象.数据库返回的内容实际上已经(通过ADO.Net)转换为Int161,但由于表达式的返回值是object,因此该值已经装箱.我在Boxing and Unboxing的文章中发表评论.你的表达:
int j = (int)dt.Rows[x]["SmallintColumnname"];
是尝试从对象中取消装箱值.但是装箱和拆箱的规则说你只能打开与装箱完全相同的类型(除了一些奇怪的规则与枚举及其底层类型,IIRC).但是既然我们知道我们拥有的是盒装Int16,那么你将得到一个InvalIDCastException.
你能做的是:
int j = (int)(Int16)dt.Rows[x]["SmallintColumnname"];
甚至只是:
int j = (Int16)dt.Rows[x]["SmallintColumnname"];
我们首先取消装箱Int16值,然后显式(第一个示例)或隐式(第二个)将Int16转换为Int32.有点不幸的是,铸造和拆箱看起来完全一样.
Convert.ToInt32(object)是一个完全不同的野兽,支持各种转换.它实际上做的是将参数强制转换为IConvertible接口(Int16支持),然后在Int16上调用ToInt32方法.反过来,转向并调用Convert.ToInt32(Int16),已经从盒装Int16切换回仅仅是一个普通的Int16,最终被隐式转换为Int32.魔法.
1我尝试过,但我认为失败了,在我使用的类型名称的答案中保持一致.但请注意,short和Int16的类型完全相同. int和Int32也是相同的类型.因此,将您的尝试从(int)切换到(Int32)实际上并没有导致编译代码的任何更改.
总结以上是内存溢出为你收集整理的c# – 为什么我不能将一个smallint从MSSQL转换为int,如下所示:int x =(int)dt.Rows [x] [“smallIntColumn”]全部内容,希望文章能够帮你解决c# – 为什么我不能将一个smallint从MSSQL转换为int,如下所示:int x =(int)dt.Rows [x] [“smallIntColumn”]所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)