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