似乎没有办法在两个字节上使用 C# 的三元运算符,如下所示:
byte someByte = someBoolean ? 0 : 1;
该代码当前无法使用“无法将源类型'int'转换为目标类型'byte'”进行编译,因为编译器将数字视为整数。显然没有指定的后缀来指示 0 和 1 是字节,因此唯一的解决方法是 (a) 将结果转换为字节或 (b) 毕竟使用 if-else 控件。
有什么想法吗?
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
你总是可以这样做:
var myByte = Convert.ToByte(myBool);
这将产生 myByte == 0 为 false 和 myByte == 1 为 true。
byte someByte = (byte)(someBoolean ? 0 : 1);
在VS2008上编译OK。
更正:这在VS2008中编译OK:
byte someByte = true ? 0 : 1;
byte someByte = false ? 0 : 1;
但这不会:
bool someBool = true;
byte someByte = someBool ? 0 : 1;
奇怪的!
编辑:按照埃里克的建议(见下面他的评论),我尝试了这个:
const bool someBool = true;
byte someByte = someBool ? 0 : 1;
它编译完美。并不是说我不信任埃里克;为了完整起见,我只是想在此处包含此内容。