Я знаю, что компилятор делает неявное преобразование типов для целых литералов. Например:Почему компилятор не дает ошибку для этой операции добавления?
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 ?
Почему это не дает мне ошибку?
Ваш просто расширение этого дубликата ... Когда вы выполняете 'byte z = (a + = b);', вы просто назначаете один ** байт ** ('a') другому (' z '). – Codebender
Голосование для повторного открытия, потому что дубликат отвечает на другой вопрос. Он спрашивает, почему 'i + = j' разрешен, когда' j' больше, чем 'i'. Этот вопрос не связан с этим. – ajb
Я удивлен, что никто не упоминал об этом, но если вы определяете b final, byte d = 1 + b; будет компилироваться. Это должно дать вам намек. –