Причина, по которой ваши первые два семпла не компилируются, заключается в том, что:
- Приведение связывает "более плотно", чем вычитание.То есть '(C) de' означает '((C) d) -e', а не '(C) (de)'.Оператор приведения имеет более высокий приоритет.
- Поэтому тип обоих операндов для вычитания является байтовым, независимо от приведений.
- Тип вычитания - int, потому что нет оператора вычитанияопределено в байтах.
- Таким образом, вы присваиваете байту целое число без приведения, что недопустимо.
В байтах нет оператора вычитания, поскольку, предположим, выесть байт, содержащий 7, и вы вычитаете из него байт, содержащий 8, вы действительно хотите, чтобы это был байт 255?Я думаю, что большинство людей хотели бы, чтобы это был int -1.
Наконец, с какой стати ты вообще делаешь это в байтах?Это не имеет никакого смысла.Символы не являются байтами в C #;если вы хотите сделать арифметику с символами, то почему бы не вычесть char 96 из символа 'y' вместо выполнения преобразования с потерями и опасного преобразования в байт?