根据C#语言规范4.0第7.17.2节:
7.17.2 复合赋值
x op= y 形式的运算是这样来处理的:应用重载决策(第 7.2.4 节),就好比运算的书写形式为 x op y。然后,
- 如果选定的运算符的返回类型可“隐式”转换为 x 的类型,则运算按 x = x op y 计算,但 x 只计算一次
- 否则,如果选定运算符是预定义的运算符,选定运算符的返回类型可“显式”转换为 x 的类型,并且 y 可“隐式”转换为 x 的类型或者该运算符是移位运算符,则运算按 x = (T)(x op y) 计算(其中 T 是 x 的类型),但 x 只计算一次。
- 否则,复合赋值无效,且发生绑定时错误。
t += 1符合第2条。而t = t + 1会编译报错是因为:t + 1运算是一个byte加上一个int,因此它的结果是一个int,将一个大小未知的int值直接赋给一个byte类型的变量是不允许的。
并且 y 可“隐式”转换为 x 的类型或者该运算符是移位运算符? y不可“隐式”转换为 x把 而且哪个是移位运算符。。
@koi: 这里y是1,1当然可以隐式转成byte,不信你byte b = 1;试试。“移位运算符”跟你的问题没有关系,这里说了“或者是移位运算符”。
t = t +1; 不能隐式转换
t +=1;
(t+1).GetType() 这个是int类型的,所以要显示转换
这么说吧;+ 是左结合,就是从右向左结合,遇到1为int类型,所以t+1结果转换为int类型了
+=是右结合,即从左向右,遇t是short类型,之后的1则转换为short类型,结果为short类型
不是的。是類型不一樣。你short+1,有可能超過short的範圍。因此應該進行轉換
t=(short)(t+1)
short t =1; t = t +1; // 编译报错 需要显示转换
short t =1; t +=1; //正确
请问这两个有什么区别
@koi: 這個應該是計算方法不一樣。第一個是相當於2個數相加。下面的是一個數自加。實現原理不一樣。
1,系统做int整形处理的,+ 运算默认向上转型,so.....
通过反编译工具 你就知道真相了