Ответ 1
Его эквивалентное утверждение
s[i] = s[i]+s[j]
вызовет ошибку следующим образом
Это не эквивалентное утверждение, хотя я могу понять, почему вы этого ожидаете. Из раздела 12.18.3 стандарта С# 5 ECMA, касающегося составного назначения:
Операция вида
x op= y
обрабатывается путем применения разрешения перегрузки бинарного оператора (§12.4.5), как если бы операция была записанаx op y
. Затем,
- Если возвращаемый тип выбранного оператора неявно преобразуется в тип x, операция оценивается как
x = x op y
, за исключением того, чтоx
вычисляется только один раз.- В противном случае, если выбранный оператор является предопределенным оператором, если тип возвращаемого значения выбранного оператора явно преобразуется в тип
x
, и еслиy
неявно преобразуется в типx
или оператор является оператором сдвига, тогда операция оценивается какx = (T)(x op y)
, гдеT
- это типx
, за исключением того, чтоx
оценивается только один раз.
Эта вторая пуля - вот что здесь происходит. Там нет оператора для сложения значений char
вместе - есть оператор int +(int, int)
, который выбран, и есть явное преобразование из int
в char
.
Итак, это:
s[i] += s[j];
более эквивалентно
s[i] = (char) (s[i] + s[j]);
... который прекрасно компилируется.