见鬼了。int 不能转long

SoulRed 2019-07-31 10:53:36
item[1]是object类型 是个整数8

long a = (long)item[1];//报错
long a = (int)item[1];//OK

下面是报错的信息。
System.InvalidCastException:“Unable to cast object of type 'System.Int32' to type 'System.Int64'.”
我很奇怪,为什么只能转Int??
...全文
2734 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
SoulRed 2019-08-28
  • 打赏
  • 举报
回复
解决了,给大家说一下,我的item[1]原类型是int32 但这里因为数据传输问题,他在c#里显示的是object类型 强制转换是可以把int 转成long 的,但不可把元贝是int32的object类型直接转为long。 先将item[1] 这个object类型拆箱为原类型,才可以进行转换。。不然直接将object类型转为long他会发现长度不够。。所以报错
hhddzz 2019-08-09
  • 打赏
  • 举报
回复
以前MSDN BLOG上专门有一篇文章解释为什么VB.NET和C#在这些方面设计不一样
hhddzz 2019-08-09
  • 打赏
  • 举报
回复
C#里,拆箱就是单纯的拆箱,不进行隐式数据转换 VB.NET是可以的
qq_30860653 2019-08-09
  • 打赏
  • 举报
回复
引用 32 楼 HyoJung 的回复:
[quote=引用 1 楼 fengduicanhe 的回复:]
long不支持强制string转换吧?可以这么些
long a = long.Parse(item[1]);

+1[/quote]
+1
大鱼> 2019-08-09
  • 打赏
  • 举报
回复
引用 1 楼 fengduicanhe 的回复:
long不支持强制string转换吧?可以这么些 long a = long.Parse(item[1]);
+1
天字第零号 2019-08-07
  • 打赏
  • 举报
回复
因为数值默认就是int形,你存的时候肯定是obj=1这样,然后就存了一个int值,再取的时候你把他取成一个long肯定报错因为int是32位的long是64位的,取的时候取int,然后会触发隐士类型转换转成long
  • 打赏
  • 举报
回复
使用封装类Long.parseLang(int)转型
weixin_42171260 2019-08-04
  • 打赏
  • 举报
回复
能直接用其它类型能直接用其它类型拆箱,int是可以隐式转化成long拆箱,int是可以隐式转化成long
weixin_45465140 2019-08-04
  • 打赏
  • 举报
回复
真怎么写不上去 真是见了鬼。
姚传明 2019-08-03
  • 打赏
  • 举报
回复
help里找实例 常规问题
秋的红果实 2019-08-03
  • 打赏
  • 举报
回复
这是一个拆箱成long的问题 用Convert.ToInt64(item[1])应该没问题 https://docs.microsoft.com/en-us/dotnet/api/system.convert?view=netframework-4.8 建议少用(类型)
qq_43415463 2019-08-03
  • 打赏
  • 举报
回复
加油,10分先拿走了
wanghui0380 2019-08-02
  • 打赏
  • 举报
回复
很多XX园的例子,console.writeline()喊拆箱,拆个屁的箱,如果只是打印一下,他只会调用object的tostring,不用拆的
wanghui0380 2019-08-02
  • 打赏
  • 举报
回复
至于编译器编译过程,微软不是你。微软不知道你要干啥,所以他不会帮你自作主张,js那种弱类型的才会那么做
wanghui0380 2019-08-02
  • 打赏
  • 举报
回复
引用 14 楼 橘子皮zzz 的回复:
[quote=引用 5 楼 朱帝11 的回复:] 在工作情况下(int→long,object(boxed int)→int),编译器确切地知道要产生什么代码。如果boxed int→long是工作,编译器将不得不弄清楚使用哪个转换,但它没有足够的信息来做。
我想了想,不对啊,int->long并不会损失信息啊,为什么编译器不知道先拆箱box int -> int,再int->long呢?完全可以啊,又不会损失任何信息[/quote]
引用 11 楼 圣殿骑士18 的回复:
有点意思。原来拆箱的时候,不允许拆成非装箱的类型。 我又思考了下为什么?我的看法是:保持C#作为强类型语言的严谨性。这个严谨性,可以用一句话来描述:一个“操作”不应该允许做两次隐式转换。 比如你的这个例子,long a = (long)item[1],右侧做了两次隐式转换,先拆包成int,int再转成long。 而你的第二个例子,为什么就行呢?long a = (int)item[1],因为它有两个操作,右侧是拆包,左侧long的定义,表明了需要隐式转换。
你们两个都一样,请理解一下“类型方法表”,请理解一下“对象父子类型转换的实质” 请理解一下 "我是字符串"可以indexof,而 ((object)"我是字符串")就只能tostring??因为object的方法表里只有,tostring,equere,这几个基础方法。 隐式转换,本身并没有任何秘密,他就是定义操作符,而你写的操作符,在哪里。在object方法表里么?当然不再,object 不认识什么int2long的操作符
「已注销」 2019-08-02
  • 打赏
  • 举报
回复
你得用封装类,基本类型没法转 封装类 Long ,Integer
橘子皮... 2019-08-02
  • 打赏
  • 举报
回复
引用 19 楼 Orszsxlping 的回复:
你得用封装类,基本类型没法转
封装类怎么写
乔治George886 2019-08-02
  • 打赏
  • 举报
回复
好像是和CPU的字长有关,如果是64位编译器可以换32位编译器试试
正怒月神 2019-08-02
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
[quote=引用 7 楼 正怒月神 的回复:] 在转换为object时,object的Type属性就被确定了。 我猜测是,在转换时,可能比较了Type
前面已经说了,都是老祖宗玩剩下的。 类型-或者说装箱------丢失了对象方法表,默认转换方法在方法表里( public static implicit operator long(Current value))。就拿装箱本身来说,就好像京东给打包一个包裹,上面只写了“地址,姓名,联想电脑1台”-------------你自己拆箱才有详细的“型号,主板,cpu,内存” 这就是损有余。-----------object方法表里有这个operator long方法么?很明显没有 拆箱-----获取详细信息------补不足 所以俺们不管,用convert.toxxxx,这个方法内部自己补不足的。他首先问一下 is IConverter,如果是,他就先拆箱转成IConvert,这时候就有转换方法表了[/quote] 哦,是了,我看了下int32,的确是实现了类型转换。
Orszsxlping 2019-08-02
  • 打赏
  • 举报
回复
😀你得用封装类,基本类型没法转
加载更多回复(13)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧