Почему приведение требуется для вычитания байтов в C#?
Я должен следующий код в VS2008 .net 3.5 с помощью WinForms:
byte percent = 70;
byte zero = 0;
Bitmap copy = (Bitmap)image1.Clone();
...
Color oColor = copy.GetPixel(x, y);
byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent);
Когда я уйду (byte)
"из последней строки кода я получаю сообщение об ошибке компилятора" Не могу неявно преобразовать тип " int
к byte
'. "Если все имеет тип byte
а также byte
это целочисленный тип... тогда почему мне нужно иметь приведение?
9 ответов
Потому что вычитание приводит к целому числу. Насколько я помню, в C# байт является беззнаковым типом, поэтому вычитание может вывести вас из области байтов.
Это потому, что результат вычитания байта не помещается в байте:
byte - byte = (0..255) - (0..255) = -255..255
Поскольку арифметика в байтах по умолчанию возвращает целые числа, поэтому из двух возможных присваиваний более узкий тип нуля (байт) повышается до типа int (тип oColor.r - процентов). Таким образом, тип операции - int. Компилятор не позволит без преобразования привести более широкий тип к более узкому типу, потому что это операция с потерями. Следовательно, вы получите ошибку, если только вы явно не скажете "Я знаю, что я теряю некоторые данные, все в порядке" с актерами.
Это потому что byte
вычитание возвращает int
, На самом деле любые двоичные арифметические операции на bytes
вернет int
так что актерский состав обязателен.
Потому что арифметические операции над sbyte, byte, ushort и short автоматически преобразуются в int. Наиболее вероятная причина этого заключается в том, что такие операции могут быть переполнены или недостаточны.
Таким образом, в вашей троичной операции конечный oColor.R - процент фактически приводит к целому числу, а не байту. Таким образом, возвращаемый тип операции - int.
Попробуйте запустить этот код C#: object o = (byte)(1); o = (int)o; Что вы ожидаете? Теперь попробуй:)
Я думаю, что это правильно
Эрик Липперт говорит: "Я не думаю о байтах как о" числах "; я думаю о них как о шаблонах битов, которые можно интерпретировать как числа, или символы, или цвета, или что-то еще. Если вы собираетесь заниматься математикой на их и рассматривая их как числа, тогда имеет смысл перенести результат в тип данных, который чаще интерпретируется как число ".
Возможно, байт ближе к char, чем к int.
Потому что арифметическое выражение в правой части оператора присваивания по умолчанию оценивается как int. В вашем примере percent
по умолчанию int
, Вы можете прочитать больше об этом на странице MSDN.