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