首页 新闻 会员 周边 捐助

类型转换的问题?

0
悬赏园豆:5 [已解决问题] 解决于 2012-05-08 10:43

short t =1;  t = t +1;  // 编译报错 需要显示转换

short t =1;  t +=1; //正确

请问这两个有什么区别

koi的主页 koi | 初学一级 | 园豆:4
提问于:2012-05-05 14:34
< >
分享
最佳答案
0

根据C#语言规范4.0第7.17.2节:

7.17.2 复合赋值

x op= y 形式的运算是这样来处理的:应用重载决策(第 7.2.4 节),就好比运算的书写形式为 x op y。然后,

  1. 如果选定的运算符的返回类型可“隐式”转换为 x 的类型,则运算按 x = x op y 计算,但 x 只计算一次
  2. 否则,如果选定运算符是预定义的运算符,选定运算符的返回类型可“显式”转换为 x 的类型,并且 y 可“隐式”转换为 x 的类型或者该运算符是移位运算符,则运算按 x = (T)(x op y) 计算(其中 T 是 x 的类型),但 x 只计算一次。
  3. 否则,复合赋值无效,且发生绑定时错误。

t += 1符合第2条。而t = t + 1会编译报错是因为:t + 1运算是一个byte加上一个int,因此它的结果是一个int,将一个大小未知的int值直接赋给一个byte类型的变量是不允许的。

收获园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-05-05 23:12

并且 y 可“隐式”转换为 x 的类型或者该运算符是移位运算符? y不可“隐式”转换为 x把 而且哪个是移位运算符。。

koi | 园豆:4 (初学一级) | 2012-05-07 15:47

@koi: 这里y是1,1当然可以隐式转成byte,不信你byte b = 1;试试。“移位运算符”跟你的问题没有关系,这里说了“或者是移位运算符”。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-05-07 16:27
其他回答(5)
0

t = t +1; 不能隐式转换 

t +=1;

yj4018no1 | 园豆:181 (初学一级) | 2012-05-05 14:44
0

(t+1).GetType() 这个是int类型的,所以要显示转换

这么说吧;+ 是左结合,就是从右向左结合,遇到1为int类型,所以t+1结果转换为int类型了

  +=是右结合,即从左向右,遇t是short类型,之后的1则转换为short类型,结果为short类型

Halower | 园豆:1723 (小虾三级) | 2012-05-05 15:45
0

不是的。是類型不一樣。你short+1,有可能超過short的範圍。因此應該進行轉換

t=(short)(t+1)

無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-05 17:43

short t =1;  t = t +1;  // 编译报错 需要显示转换

short t =1;  t +=1; //正确

请问这两个有什么区别

支持(0) 反对(0) koi | 园豆:4 (初学一级) | 2012-05-05 19:07

@koi: 這個應該是計算方法不一樣。第一個是相當於2個數相加。下面的是一個數自加。實現原理不一樣。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-06 07:52
0

1,系统做int整形处理的,+ 运算默认向上转型,so.....

go on coding | 园豆:343 (菜鸟二级) | 2012-05-05 19:05
0

通过反编译工具 你就知道真相了

不信 | 园豆:209 (菜鸟二级) | 2012-05-06 02:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册