Чтобы использовать методы и член объекта, вам сначала нужно создать этот объект. Если вы его не создали (переменная, которая должна содержать объект, не инициализируется), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.
Иногда вы можете просто забыть инициализировать .
Отредактировано: new не может вернуть значение null, но исключение огня при ошибке. Давно это было на некоторых языках, но не больше. Спасибо @John Saunders за указание на это.
Ну, оператор +=
говорит, что вы будете увеличивать значение a
с коротким, а =
говорит, что вы переписываете значение, с результатом операция. Операция a + b
дает int, не зная, что она может сделать иначе, и вы пытаетесь присвоить этот int короткому.
Здесь есть два вопроса. Во-первых, «почему короткий плюс короткий результат в 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)
- , поэтому это должно быть законным
Если оно не ввело листинг для вас, тогда было бы невозможно использовать составное назначение на много типов.
Это происходит потому, что int является наименьшим подписанным типом, для которого определен +
. Все, что меньше, сначала продвигается до int. Оператор +=
определен по отношению к +
, но со специальным случаем для обработки результатов, которые не соответствуют цели.
Это потому, что + = реализуется как перегруженная функция (одна из которых короткая, а компилятор выбирает наиболее специфическую перегрузку). Для выражения (a + b) компилятор расширяет результат до значения int по умолчанию перед назначением.
Вы должны использовать:
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, кто-то с более глубоким пониманием, может комментировать.