Как изменить мой код для решения проблемы переполнения байтов - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в C #.

Почему я получаю разные результаты при использовании этих двух методов:

Метод I

  byte x = 255;
  x = x + 1;

Метод II

  byte x = 255;
  x += 1;

Метод I приводит к ошибке, которая не может быть успешно скомпилирована.

S0266 C # Невозможно неявно преобразовать тип 'int' в 'byte'.Существует явное преобразование (вы пропустили приведение?)

Если я добавлю приведение и напишу

byte x = (byte)255;
x = x + 1; 

Затем приведение будет лишним.

Если я напишу

byte x = 255;
x = x + (byte)1;

Приведение снова избыточно.

Что я могу сделать, чтобы получить 0 в результате использования метода I?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Преобразование int в байт требует явного приведения, поэтому вам придется написать

byte x = 255;
x = (byte)(x + 1);

В общем случае неявные преобразования (не требующие приведения) резервируются для преобразований типов без потерь, а явные преобразования предназначены дляпотенциально преобразования с потерями, что имеет место с int в байт.

0 голосов
/ 27 сентября 2018

Рассматривая спецификацию, раздел 7.8.4 касается операторов сложения.Здесь он описывает четыре предопределенных целочисленных оператора сложения следующим образом:

оператор int + (int x, int y);

оператор uint + (uint x, uint y);

оператор long + (long x, long y);

оператор ulong + (ulong x, ulong y);

Так как System.Byte имеетнеявное преобразование в целое число, а второй операнд является целым числом, фактический используемый оператор - int operator +(int x, int y), который возвращает целое число.

Вы можете получить код для компиляции, приведя результат сложения кbyte, вот так:

x = (byte)(x + 1);

Конечно, если вы делаете это с примерами значений в контексте checked, ожидайте OverflowException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...