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