Приведение типа необходимо для byte = byte - byte? - PullRequest
8 голосов
/ 17 апреля 2010

У меня есть следующий код:

foreach (byte b in bytes)
{
    byte inv = byte.MaxValue - b;
    // Add the new value to a list....
}

Когда я делаю это, я получаю следующую ошибку:

Cannot implicitly convert type 'int' to 'byte'. 
An explicit conversion exists (are you missing a cast?)

Каждая часть этого утверждения является байтом. Почему C # хочет преобразовать byte.MaxValue - b в int?

Разве вы не сможете сделать это как-нибудь без кастинга? (т.е. я не хочу этого делать: byte inv = (byte) (byte.MaxValue - b);)

Ответы [ 3 ]

4 голосов
/ 17 апреля 2010

Раймонд Чен отвечает на ваш вопрос здесь:

http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx

4 голосов
/ 17 апреля 2010

Согласно справочнику по языку C # :

потому что арифметическое выражение в правой части оператора присваивания по умолчанию оценивается как int.

Причиной этого может быть то, что ваш процессор будет быстрее получать доступ к 4-байтовому адресу памяти, чем 1-байтовый адрес памяти, поэтому арифметические операторы определены для работы с 4-байтовыми операндами.

2 голосов
/ 17 апреля 2010

Для сложения, умножения и вычитания есть довольно хорошее объяснение: включить биты переноса в вычисление и затем выбросить их гораздо проще, чем вычислить биты переноса, если они были выброшены изначально.

Для побитовых операторов (пересечение, включающее объединение, исключительное объединение, дополнение) эти рассуждения просто не выдерживают критики. Единственное, о чем я могу думать, это то, что расширение знака будет несколько двусмысленным, если вы начнете со смеси операндов со знаком и без знака, а затем сохраните результат в более широком виде. Но это не объясняет, почему побитовые операции, которые являются унарными или где все операнды имеют одинаковый тип, должны расширять результат до int. Я считаю это очень раздражающим недостатком дизайна в C #, который:

byte a, b;
byte c = a | b;

генерирует ошибку.

...