C# числовые константы

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

byte rule = 0;
...
rule = rule | 0x80;

который производит ошибку:

Не может неявно преобразовать тип 'интервал' в 'байт'. Явное преобразование существует (Вы скучаете по броску?)

[Обновление: первая версия вопроса была неверна... Я неправильно читал выход компилятора]

Добавление броска не решает проблему:

rule = rule | (byte) 0x80;

Я должен записать это как:

rule |= 0x80;

Который просто кажется странным. Почему |= оператор, несколько отличающийся от | оператор?

Есть ли какой-либо другой способ сказать компилятору рассматривать константу как байт?


Giovanni Galbo: да и нет. Код имеет дело с программированием флэш-памяти во внешнем устройстве и логически представляет единственный байт памяти. Я мог бросить его позже, но это казалось более очевидным. Я предполагаю, что мое наследие C показывает через слишком много!

Jonathon Holland: 'поскольку' синтаксис выглядит более опрятным, но к сожалению, кажется, не работает..., он производит:

Поскольку оператор должен использоваться со ссылочным типом, или nullable тип ('байт' является не допускающим NULL-значения типом значения),

19
задан Adi Lester 15 August 2012 в 08:02
поделиться

8 ответов

int rule = 0;
rule |= 0x80;

http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx | оператор определяется для всех типов значения. Я думаю, что это будет, привел к намеченному результату. "| =" оператор, или затем присвойте оператор, который является просто сокращением от правила = правило | 0x80.

Одна из более изящных вещей о C# - то, что он позволяет Вам сделать сумасшедшие вещи как типы значения злоупотребления просто на основе их размера. 'Интервал' является точно тем же, поскольку байт, кроме компилятора бросит предупреждения, при попытке использовать их в качестве обоих одновременно. Просто придерживаться одного (в этом случае, интервал) работает хорошо. Если Вы заинтересованы готовность приблизительно на 64 бита, можно указать int32, но все ints являются int32s, даже работающим в x64 режиме.

6
ответ дан 30 November 2019 в 02:07
поделиться

C# не имеет литерального суффикса для байта. u = uint, l = долго, ул. = ulong, f = плавание, m = десятичное число, но никакой байт. Необходимо бросить его.

34
ответ дан 30 November 2019 в 02:07
поделиться

Это работает:

rule = (byte)(rule | 0x80);

, По-видимому, выражение 'правило | 0x80' возвращает интервал, даже если Вы определяете 0x80 как 'байт константы 0x80'.

11
ответ дан 30 November 2019 в 02:07
поделиться

Термин, который Вы ищете, является "Литеральным", и к сожалению C# не имеет литерала байта.

Вот список все литералы C# .

9
ответ дан 30 November 2019 в 02:07
поделиться

Согласно Спецификация ECMA, pg 72 там не является никаким литералом байта. Только целочисленные литералы для типов: интервал, uint, долго, и ulong.

3
ответ дан 30 November 2019 в 02:07
поделиться

Похож на Вас, вероятно, просто придется сделать это ужасный путь: http://msdn.microsoft.com/en-us/library/5bdb6693.aspx .

1
ответ дан 30 November 2019 в 02:07
поделиться

К сожалению, Ваше единственное обращение за помощью должно сделать это просто способ, которым Вы имеете. Нет никакого суффикса для маркировки литерала как байт. | оператор не предусматривает неявное преобразование, как присвоение (т.е. инициализация) было бы.

0
ответ дан 30 November 2019 в 02:07
поделиться

, По-видимому, выражение 'правило | 0x80' возвращает интервал, даже если Вы определяете 0x80 как 'байт константы 0x80'.

я думаю, что правило является числами как 0x80 значения по умолчанию к интервалу, если Вы не включаете литеральный суффикс. Таким образом для выражения rule | 0x80, результатом будет интервал, так как 0x80 является интервалом и правилом (который является байтом), может безопасно быть преобразован в интервал

0
ответ дан 30 November 2019 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: