Мы знаем, что эти два оператора сложения эквивалентны и компилируются в один и тот же код IL:
int x = 100;
x += 100;
x = x + 100;
Однако, когда требуется явное приведение, я заметил нечто странное:
byte b = 100;
b += 200; // Compiles (1)
b = b + 200; // Cannot implicitly convert int to byte (2)
b = (byte) (b + 200); // Compiles (3)
Очевидно, что второе утверждение требует явного приведения, потому что результатом сложения является целое число. Но странная вещь для меня - первое утверждение. Он компилируется в тот же IL, что и третий оператор, поэтому похоже, что компилятор добавляет приведение, которое должно быть явным для нас. Но это не может быть сделано во втором утверждении.
Мне это кажется противоречивым, потому что я ожидаю, что первое утверждение будет эквивалентно второму и никогда не будет компилироваться, так почему оно компилируется?
Примечание: не компилируется, когда требуется явное приведение от long
до int
:
int x = 100;
long y = 200;
x += y;