8

次のように、2 バイトで C# の三項演算子を使用する方法はないようです。

byte someByte = someBoolean ? 0 : 1;

そのコードは現在、「ソース タイプ 'int' をターゲット タイプ 'byte' に変換できません」でコンパイルに失敗します。これは、コンパイラが数値を整数として扱うためです。どうやら 0 と 1 がバイトであることを示すサフィックスが指定されていないため、唯一の回避策は (a) 結果をバイトにキャストするか、(b) if-else コントロールを使用することです。

何かご意見は?

4

4 に答える 4

19
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
于 2009-12-11T19:36:56.400 に答える
6

あなたはいつでもできる:

var myByte = Convert.ToByte(myBool);

これにより、false の場合は myByte == 0 が、true の場合は myByte == 1 が生成されます。

于 2009-12-11T19:43:36.450 に答える
4
byte someByte = (byte)(someBoolean ? 0 : 1);
于 2009-12-11T19:37:58.830 に答える
3

それはVS2008でOKをコンパイルします。

修正: これは VS2008 で問題なくコンパイルされます:

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;

そして、それは完全にコンパイルされます。エリックを信用していないわけではありません。完全を期すために、ここにこれを含めたかっただけです。

于 2009-12-11T19:37:42.970 に答える