Как использовать тернарный оператор C# с двухбайтовыми значениями?

Кажется, нет способа использовать тернарный оператор C# на двух байтах как так:

byte someByte = someBoolean ? 0 : 1;

Тому коду в настоящее время не удается скомпилировать с, "Не может преобразовать исходный 'интервал' типа для предназначения для типа 'байт'", потому что компилятор рассматривает числа как целые числа. По-видимому, нет никакого обозначенного суффикса, чтобы указать, что 0 и 1 байты, таким образом, единственные обходные решения должны (a) бросить результат в байт или (b) использовать если еще управление, в конце концов.

Какие-либо мысли?

8
задан Matt Davis 12 January 2011 в 21:10
поделиться

4 ответа

Вы всегда можете сделать:

var myByte = Convert.ToByte(myBool);

Это даст myByte == 0 для false и myByte == 1 для true.

6
ответ дан 5 December 2019 в 05:18
поделиться
byte someByte = (byte)(someBoolean ? 0 : 1);
4
ответ дан 5 December 2019 в 05:18
поделиться

Это нормально компилируется на VS2008.

Исправление : Это нормально компилируется в VS2008:

byte someByte = true ? 0 : 1;
byte someByte = false ? 0 : 1;

Но это не:

bool someBool = true;
byte someByte = someBool ? 0 : 1;

Нечетно!

Edit : Следуя совету Эрика (см. Его комментарий ниже), я попробовал следующее:

const bool someBool = true;
byte someByte = someBool ? 0 : 1;

И он компилируется отлично. Не то чтобы я не доверял Эрику; Я просто хотел включить это сюда для полноты картины.

3
ответ дан 5 December 2019 в 05:18
поделиться
byte someByte = someBoolean ? (byte)0 : (byte)1;

Приведение здесь не проблема, фактически, код IL вообще не должен иметь приведения.

Изменить: Сгенерированный IL выглядит так:

L_0010: ldloc.0          // load the boolean variable to be checked on the stack
L_0011: brtrue.s L_0016  // branch if true to offset 16
L_0013: ldc.i4.1         // when false: load a constant 1
L_0014: br.s L_0017      // goto offset 17
L_0016: ldc.i4.0         // when true: load a constant 0
L_0017: stloc.1          // store the result in the byte variable
19
ответ дан 5 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

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