Кажется, нет способа использовать тернарный оператор C# на двух байтах как так:
byte someByte = someBoolean ? 0 : 1;
Тому коду в настоящее время не удается скомпилировать с, "Не может преобразовать исходный 'интервал' типа для предназначения для типа 'байт'", потому что компилятор рассматривает числа как целые числа. По-видимому, нет никакого обозначенного суффикса, чтобы указать, что 0 и 1 байты, таким образом, единственные обходные решения должны (a) бросить результат в байт или (b) использовать если еще управление, в конце концов.
Какие-либо мысли?
Вы всегда можете сделать:
var myByte = Convert.ToByte(myBool);
Это даст myByte == 0 для false и myByte == 1 для true.
Это нормально компилируется на 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;
И он компилируется отлично. Не то чтобы я не доверял Эрику; Я просто хотел включить это сюда для полноты картины.
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