开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜