这里有两个问题。第一个问题是“为什么short加short的结果是int类型?”
假设short加short的结果还是short类型,看看会发生什么:
short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;
当使用short类型进行计算时,平均值显然是-9845。总和大于最大的short值,因此它会变成负数,然后你将得到一个负数。
在整数算术环境下,使用int类型进行所有计算要更加明智,因为该类型通常具有足够的范围,以避免溢出。
第二个问题是:
- short加short等于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。
编译器会代表你插入强制转换。正确的推理是:
- short加short等于int
- 将int分配给short是非法的
- s1 += s2等同于s1 = (short)(s1 + s2)
- 因此,这是合法的
如果它没有为你插入强制转换,那么在许多类型上使用复合赋值将是不可能的。
a += b
与a = (short)(a+b)
是相同的。 - Øyvind Bråthen