Различные ответы здесь в целом верны, но повсюду разбросана куча разных фактов. Соответствующие моменты:
1) Результат байта | byte - это целое число, потому что | оператор, определенный в байтах.
2) Вычисления, включающие только целые константы времени компиляции, рассматриваются как "проверенная" арифметика; то есть компилятор проверяет, не переполняется ли постоянный результат, и так далее. Приятным следствием этого факта является то, что присвоение целого числа константы времени компиляции переменной или константе меньшего типа автоматически проверяет, подходит ли постоянное целое число меньшему типу. Если это так, то присвоение разрешено без явного приведения. В противном случае возникает ошибка времени компиляции. (Используйте выражение «unchecked», если вы хотите переопределить это поведение.)
3) Присваивания из непостоянных выражений типа int к байту требуют приведения типов, потому что компилятор не может знать, что результат определенно соответствует байту.
4) Составные операторы присваивания автоматически вставляют приведение к типу операнда как часть своей операции, именно поэтому такие выражения, как b | = независимо от того, работают так, как вы ожидаете.
Эти четыре факта должны объяснить все поведение, на которое вы, ребята, указали.
person
Eric Lippert
schedule
14.10.2009