Почему при приведении массива (короткий, байт) в индекс [дубликат] требуется бросок,

Чтобы использовать методы и член объекта, вам сначала нужно создать этот объект. Если вы его не создали (переменная, которая должна содержать объект, не инициализируется), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.

Иногда вы можете просто забыть инициализировать .

Отредактировано: new не может вернуть значение null, но исключение огня при ошибке. Давно это было на некоторых языках, но не больше. Спасибо @John Saunders за указание на это.

63
задан Peter Mortensen 12 December 2010 в 01:01
поделиться

5 ответов

Ну, оператор += говорит, что вы будете увеличивать значение a с коротким, а = говорит, что вы переписываете значение, с результатом операция. Операция a + b дает int, не зная, что она может сделать иначе, и вы пытаетесь присвоить этот int короткому.

12
ответ дан David Hedlund 26 August 2018 в 06:29
поделиться

Здесь есть два вопроса. Во-первых, «почему короткий плюс короткий результат в int?»

Ну, предположим, что короткий плюс короткий был коротким и посмотрел, что произойдет:

short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;

И среднее значение конечно, -9845, если этот расчет сделан в шортах. Сумма больше максимально возможного короткого, поэтому она обертывается до отрицательной, а затем вы делите отрицательное число.

В мире, где целые арифметические обертывания вокруг него гораздо разумнее делать все вычисления в int, тип, который, вероятно, будет иметь достаточный диапазон для типичных вычислений, чтобы не переполняться.

Второй вопрос:

  • short plus short is 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 plus short is int
  • присвоение int short является незаконным
  • s1 + = s2 совпадает с s1 = (short) (s1 + s2)
  • , поэтому это должно быть законным

Если оно не ввело листинг для вас, тогда было бы невозможно использовать составное назначение на много типов.

69
ответ дан Eric Lippert 26 August 2018 в 06:29
поделиться

Это происходит потому, что int является наименьшим подписанным типом, для которого определен +. Все, что меньше, сначала продвигается до int. Оператор += определен по отношению к +, но со специальным случаем для обработки результатов, которые не соответствуют цели.

7
ответ дан Marcelo Cantos 26 August 2018 в 06:29
поделиться

Это потому, что + = реализуется как перегруженная функция (одна из которых короткая, а компилятор выбирает наиболее специфическую перегрузку). Для выражения (a + b) компилятор расширяет результат до значения int по умолчанию перед назначением.

1
ответ дан Stefan Mai 26 August 2018 в 06:29
поделиться

Вы должны использовать:

a = (short)(a + b);

Что касается разницы между поведением назначения и присваивания, я полагаю, что это имеет какое-то отношение к этому (из msdn)

x+=y
is equivalent to
x = x + y
except that x is only evaluated once. The meaning of the + operator is
dependent on the types of x and y (addition for numeric operands, 
concatenation for string operands, and so forth).

Однако, это немного расплывчато, поэтому mabye, кто-то с более глубоким пониманием, может комментировать.

7
ответ дан UpTheCreek 26 August 2018 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: