Я знаю, что компилятор делает неявное преобразование типов для целых литералов. Например:
byte b = 2; // implicit type conversion, same as byte b = (byte)2;
Компилятор дает мне ошибку, если диапазон переполняется:
byte b = 150; // error, it says cannot convert from int to byte
Компилятор дает ту же ошибку, когда переменной передается выражение:
byte a = 3;
byte b = 5;
byte c = 2 + 7; // compiles fine
byte d = 1 + b; // error, it says cannot convert from int to byte
byte e = a + b; // error, it says cannot convert from int to byte
Я пришел к выводу, что результат выражения, включающего переменные, не может быть гарантирован. Результирующее значение может находиться внутри или вне диапазона байтов, поэтому компилятор выдает ошибку.
Что меня озадачивает, так это то, что компилятор не бросает ошибку, когда я так выразился:
byte a = 127;
byte b = 5;
byte z = (a+=b); // no error, why ?
Почему это не дает мне ошибку?