Здесь есть два вопроса. Во-первых, «почему короткий плюс короткий результат в int?»
Итак, предположим, что короткий плюс короткий был коротким, и посмотрим, что произойдет:
short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;
И среднее значение, конечно, -9845, если этот расчет делается в шортах. Сумма больше, чем максимально возможное короткое, поэтому она оборачивается в отрицательное значение, а затем вы делите отрицательное число.
В мире, где целочисленная арифметика оборачивается, гораздо разумнее делать все вычисления в int, типе, который, вероятно, будет иметь достаточный диапазон, чтобы типичные вычисления не переполнялись.
Второй вопрос:
- шорт плюс шорт - это инт
- присваивание int короткому недопустимо
- a + = b совпадает с a = a + b
- поэтому short + = short должно быть недопустимым
- так почему это законно?
У вопроса неверная предпосылка; третья строка выше неверна. Спецификация C # говорится в разделе 7.17.2
В противном случае, если выбранный оператор
предопределенный оператор, если возврат
тип выбранного оператора
явно конвертируется в тип
х, и если у неявно конвертируется
к типу х или оператор является
оператор сдвига, то операция
оценивается как x = (T) (x op y), где T
это тип х, за исключением того, что х
оценивается только один раз.
Компилятор вставляет приведение от вашего имени. Правильные рассуждения:
- шорт плюс шорт - это инт
- присваивать int для short недопустимо
- s1 + = s2 совпадает с s1 = (короткий) (s1 + s2)
- поэтому это должно быть законно
Если бы он не вставил приведение для вас, то было бы невозможно использовать составное назначение для многих типов.