一个很简单的迷惑

zhaowentao_bc 2012-04-19 09:36:22
short s1=1;
s1=s1+1; //错误 1 无法将类型“int”隐式转换为“short”。存在一个显式转换(是否缺少强制转换?)
s1+=1; //运行通过

为什么会这样呢?有什么区别?
...全文
174 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
E次奥 2012-04-20
  • 打赏
  • 举报
回复
s1+=1 是自增,自增会自动转换类型的。
s1=s1+1;是加法运算,不会自动转换为int类型,所以就错了。
  • 打赏
  • 举报
回复
当然,如果所加的整数很大如s1 = (short)(s1 + 9999999999999999),数据会溢出,s1结果为0
  • 打赏
  • 举报
回复
表达式(s1 += 1)是复合赋值表达式,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换
s1+=1等效于 s1=(short)(s1+1),所以不会报错
极地_雪狼 2012-04-20
  • 打赏
  • 举报
回复
顶啊。这么好的回答。
cnwin 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

s1=s1+1;错误的原因,更准确的说s1+1不会有错,int和Int16相加之前,c#会把s1转化为int,也就是(int)S1+1,然后s1+1显然是int类型,把int类型赋值给S1类型就不匹配了,这才是真正错误的原因,

提示是:无法将类型“int”隐式转换为“short”

这说明因为int无法转化为short导致的错误,而正好是=赋值运算的时候需要把int转成short,因为……
[/Quote]
嗯,解释得很好。
orochiheart 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

s1=s1+1;错误的原因,更准确的说s1+1不会有错,int和Int16相加之前,c#会把s1转化为int,也就是(int)S1+1,然后s1+1显然是int类型,把int类型赋值给S1类型就不匹配了,这才是真正错误的原因,

提示是:无法将类型“int”隐式转换为“short”

这说明因为int无法转化为short导致的错误,而正好是=赋值运算的时候需要把int转成short,因为……
[/Quote]
学习了! 我之前的理解是错误的 楼主参考这个 呵呵。。是在=的时候抱的错 而不是=右侧
orochiheart 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

s1=s1+1;错误的原因,更准确的说s1+1不会有错,int和Int16相加之前,c#会把s1转化为int,也就是(int)S1+1,然后s1+1显然是int类型,把int类型赋值给S1类型就不匹配了,这才是真正错误的原因,

提示是:无法将类型“int”隐式转换为“short”

这说明因为int无法转化为short导致的错误,而正好是=赋值运算的时候需要把int转成short,因为……
[/Quote]
V5
色拉油 2012-04-20
  • 打赏
  • 举报
回复
霸气[Quote=引用 4 楼 的回复:]

s1=s1+1;错误的原因,更准确的说s1+1不会有错,int和Int16相加之前,c#会把s1转化为int,也就是(int)S1+1,然后s1+1显然是int类型,把int类型赋值给S1类型就不匹配了,这才是真正错误的原因,

提示是:无法将类型“int”隐式转换为“short”

这说明因为int无法转化为short导致的错误,而正好是=赋值运算的时候需要把int转成short,因为……
[/Quote]
stonespace 2012-04-20
  • 打赏
  • 举报
回复
s1=s1+1;错误的原因,更准确的说s1+1不会有错,int和Int16相加之前,c#会把s1转化为int,也就是(int)S1+1,然后s1+1显然是int类型,把int类型赋值给S1类型就不匹配了,这才是真正错误的原因,

提示是:无法将类型“int”隐式转换为“short”

这说明因为int无法转化为short导致的错误,而正好是=赋值运算的时候需要把int转成short,因为s1+1是int类型,

如果在s1+1的时候出错,应该提示的是无法将类型short转换为int,因为两个整数类型不匹配的时候,会把位数少的类型转化为位数多的类型,这样才不会有溢出,
stonespace 2012-04-20
  • 打赏
  • 举报
回复
s1+=1;正确的原因是Int16.operator+=运算符有一个版本可以接受int参数,
crystal_lz 2012-04-20
  • 打赏
  • 举报
回复
同意楼上、、
不过 我也是个人理解、、、
GundamG 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

s1=s1+1;错误的原因,更准确的说s1+1不会有错,int和Int16相加之前,c#会把s1转化为int,也就是(int)S1+1,然后s1+1显然是int类型,把int类型赋值给S1类型就不匹配了,这才是真正错误的原因,

提示是:无法将类型“int”隐式转换为“short”

这说明因为int无法转化为short导致的错误,而正好是=赋值运算的时候需要把int转成short,因为……
[/Quote]

学习了。
orochiheart 2012-04-19
  • 打赏
  • 举报
回复
哈哈 好问题 我个人的理解 s1=s1+1; 报错是因为1是int类型 所以和short相加的话自然是需要转换成同一类型的,
至于 s1+=1; 这种写法会自动进行隐式转吧 (自动将1转化成了short)应该是C#语言的一种约定 或者是编译器?

111,115

社区成员

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

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

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