How to use C#'s ternary operator with two byte values?
There doesn't seem to be a way to use C#'s ternary operator on two bytes like so:
byte someByte = someBoolean ? 0 : 1;
That code currently fails to compile with "Cann开发者_JAVA技巧ot convert source type 'int' to target type 'byte'", because the compiler treats the numbers as integers. Apparently there is no designated suffix to indicate that 0 and 1 are bytes, so the only workarounds are to (a) cast the result into a byte or (b) to use an if-else control after all.
Any thoughts?
byte someByte = someBoolean ? (byte)0 : (byte)1;
The cast is not a problem here, in fact, the IL code should not have a cast at all.
Edit: The IL generated looks like this:
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
You could always do:
var myByte = Convert.ToByte(myBool);
This will yield myByte == 0 for false and myByte == 1 for true.
byte someByte = (byte)(someBoolean ? 0 : 1);
That compiles OK on VS2008.
Correction: This compiles OK in VS2008:
byte someByte = true ? 0 : 1;
byte someByte = false ? 0 : 1;
But this does not:
bool someBool = true;
byte someByte = someBool ? 0 : 1;
Odd!
Edit: Following Eric's advice (see his comment below), I tried this:
const bool someBool = true;
byte someByte = someBool ? 0 : 1;
And it compiles perfectly. Not that I distrust Eric; I just wanted to include this here for the sake of completeness.
精彩评论