这里有两个问题。第一个是“为什么短加短的结果是int?”
好吧,假设 short plus short 很短,看看会发生什么:
short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;
如果这个计算是在短裤中进行的,那么平均值当然是 -9845。总和大于可能的最大空头,所以它环绕为负数,然后除以负数。
在整数算术环绕的世界中,在 int 中进行所有计算更为明智,这种类型可能具有足够的范围以使典型计算不会溢出。
第二个问题是:
- 短加短是 int
- 将 int 分配给 short 是非法的
- a +=b 与 a = a + b 相同
- 因此 short += short 应该是非法的
- 那么为什么这是合法的呢?
问题的前提不正确;上面的第三行是错误的。C# 规范在第 7.17.2 节中声明
否则,如果所选运算符是预定义运算符,如果所选运算符的返回类型可显式转换为 x 的类型,并且如果 y 可隐式转换为 x 的类型或运算符是移位运算符,则操作计算为 x = (T)(x op y),其中 T 是 x 的类型,除了 x 只计算一次。
编译器代表您插入强制转换。正确的推理是:
- 短加短是 int
- 将 int 分配给 short 是非法的
- s1 += s2 与 s1 = (short)(s1 + s2) 相同
- 因此这应该是合法的
如果它没有为您插入强制转换,那么就不可能在许多类型上使用复合赋值。