如何使用C#的三元运算符和两个字节值?

end*_*inh 8 c# byte ternary

似乎没有办法在两个字节上使用C#的三元运算符,如下所示:

byte someByte = someBoolean ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)

该代码当前无法使用"无法将源类型'int'转换为目标类型'byte'"进行编译,因为编译器将这些数字视为整数.显然没有指定的后缀表示0和1是字节,所以唯一的解决方法是(a)将结果转换为字节或(b)使用if-else控件.

有什么想法吗?

Luc*_*ero 19

byte someByte = someBoolean ? (byte)0 : (byte)1;
Run Code Online (Sandbox Code Playgroud)

演员阵容在这里不是问题,事实上,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
Run Code Online (Sandbox Code Playgroud)

  • @Randolpho:不,OP说他可以施放*结果* - Lucero的答案会转换*操作数*会产生不同的效果; 强制转换是在编译时而不是执行时完成的. (12认同)

Ran*_*pho 6

你可以随时做:

var myByte = Convert.ToByte(myBool);
Run Code Online (Sandbox Code Playgroud)

这将产生myByte == 0表示false,myByte == 1表示true.

  • 我真的很惊讶,有人建议它需要很长时间. (2认同)

Mat*_*vis 5

byte someByte = (byte)(someBoolean ? 0 : 1);
Run Code Online (Sandbox Code Playgroud)