19

次の C# コードがあります。

byte rule = 0;
...
rule = rule | 0x80;

エラーが発生します:

タイプ 'int' を 'byte' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

[更新: 質問の最初のバージョンが間違っていました...コンパイラの出力を読み間違えました]

キャストを追加しても問題は解決しません。

rule = rule | (byte) 0x80;

次のように書く必要があります。

rule |= 0x80;

これは奇妙に思えます。|=オペレーターがオペレーターと異なるのはなぜ|ですか?

定数をバイトとして扱うようにコンパイラに指示する他の方法はありますか?


@ジョバンニ・ガルボ:はい、いいえ。このコードは、外部デバイスのフラッシュ メモリのプログラミングを処理しており、メモリの 1 バイトを論理的に表しています。後でキャストすることもできましたが、これはより明白に見えました。私の C の伝統があまりにも露骨に表れていると思います!

@ Jonathon Holland : 'as' 構文の方がきれいに見えますが、残念ながら機能していないようです ... 次のようになります。

as 演算子は、参照型または null 許容型で使用する必要があります ('byte' は null 非許容値型です)。

4

10 に答える 10

34

C# には、バイトのリテラル サフィックスがありません。u = uint、l = long、ul = ulong、f = float、m = decimal、ただしバイトはありません。あなたはそれをキャストする必要があります。

于 2008-09-04T02:03:09.063 に答える
11

これは機能します:

rule = (byte)(rule | 0x80);

どうやら「ルール | 0x80 を 'const byte 0x80' として定義しても、0x80' は int を返します。

于 2008-09-04T02:05:53.440 に答える
9

お探しの用語は「リテラル」ですが、残念ながら C# にはバイト リテラルがありません。

すべての C# リテラルの一覧を次に示します。

于 2008-09-04T02:04:33.787 に答える
6
int rule = 0;
rule |= 0x80;

http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx | operator は、すべての値の型に対して定義されています。これで意図した結果が得られると思います。"|=" 演算子は or then 代入演算子であり、単純に rule = rule | の省略形です。0x80。

C# の優れた点の 1 つは、単純にサイズに基づいて値の型を乱用するなどのクレイジーなことを実行できることです。「int」はバイトとまったく同じですが、両方を同時に使用しようとするとコンパイラが警告をスローします。単純に 1 つ (この場合は int) を使用するとうまくいきます。64 ビット対応が心配な場合は、int32 を指定できますが、x64 モードで実行されている場合でも、すべての int は int32 です。

于 2008-09-04T02:10:47.860 に答える
3

ECMA仕様、pg 72によると、バイトリテラルはありません。タイプの整数リテラルのみ: int、uint、long、および ulong。

于 2008-09-04T02:05:05.393 に答える
2

ほぼ 5 年が経過しましたが、実際にその質問に答えた人はいません。

問題はバイトリテラルの欠如であると主張する回答がいくつかありますが、これは無関係です。結果を計算(byte1 | byte2)すると、タイプはint. "b" が byte のリテラル サフィックスであったとしても、型(23b | 32b)int.

受け入れられた回答は、すべての整数型に対して定義されていると主張する MSDN の記事にリンクしていますoperator|が、これも真実ではありません。

operator|は on で定義されていないbyteため、コンパイラは通常のオーバーロード解決規則を使用して、で定義されているバージョンを選択しintます。したがって、結果を a に割り当てたい場合はbyte、キャストする必要があります。

rule = (byte)(rule | 0x80);

なぜ機能するのかという疑問が残りrule |= 0x80;ます。

C# の仕様には、明示的な変換を省略できる複合代入の特別なルールがあるためです。複合割り当てx op= yでは、ルールは次のとおりです。

選択された演算子が事前定義された演算子である場合、選択された演算子の戻り値の型が x の型に明示的に変換可能である場合、および y が x の型に暗黙的に変換可能である場合、または演算子がシフト演算子である場合、演算が評価されます。 x が 1 回だけ評価されることを除いてx = (T)(x op y)、T は x の型です。

于 2013-06-02T16:35:37.257 に答える
1

醜い方法で行う必要があるようです: http://msdn.microsoft.com/en-us/library/5bdb6693.aspx

于 2008-09-04T02:01:45.370 に答える
0

残念ながら、あなたの唯一の手段は、あなたが持っている方法でそれを行うことです. リテラルをバイトとしてマークするサフィックスはありません。| | 演算子は、代入 (つまり、初期化) のような暗黙的な変換を提供しません。

于 2008-09-04T02:05:30.587 に答える
0

どうやら「ルール | 0x80 を 'const byte 0x80' として定義しても、0x80' は int を返します。

リテラルサフィックスを含めない限り、ルールは 0x80 のような数値であり、デフォルトで int になると思います。したがって、式rule | 0x80の場合、0x80 は int であり、ルール (バイト) は安全に int に変換できるため、結果は int になります。

于 2008-09-04T02:26:33.423 に答える