6

これは本当に奇妙です。誰かがこれを説明できますか?

このコードは機能しません:

const byte ASC_OFFSET = 96;
string Upright = "firefly";
byte c7 = (byte)Upright[6] - ASC_OFFSET;
//Cannot implicitly convert type 'int' to 'byte'.

このコードも機能しません:

const byte ASC_OFFSET = 96;
string Upright = "firefly";
byte c7 = (byte)Upright[6] - (byte)ASC_OFFSET;
//Cannot implicitly convert type 'int' to 'byte'.

それでも、減算を別の行に置くことは問題なく機能します。

const byte ASC_OFFSET = 96;
string Upright = "firefly";
byte c7 = (byte)Upright[6];
c7 -= ASC_OFFSET;

必要に応じて、ステートメントを別々の行に配置してもかまいません...しかし、疑問に思う必要があります...

なんで?

4

3 に答える 3

7

これは、1)byte操作の結果int(理由はこちら: http: //blogs.msdn.com/b/oldnewthing/archive/2004/03/10/87247.aspx)および2)次のC#コードが発生するためです。

c7 -= ASC_OFFSET;

舞台裏で「魔法のように」コンパイルされます

c7 = (byte)(c7 - ASC_OFFSET);

これは、C#仕様で明示的に文書化されています:http ://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf

14.14.2複合代入:

x op = yの形式の演算は、演算がx op yで記述されているかのように、二項演算子の過負荷解決(§14.2.4)を適用することによって処理されます。それで、

•選択した演算子の戻り型が暗黙的にxの型に変換可能である場合、xが1回だけ評価されることを除いて、操作はx = xopyとして評価されます。

それ以外の場合、選択された演算子が事前定義された演算子であり、選択された演算子の戻り型が明示的にxの型に変換可能であり、yが暗黙的にxの型に変換可能であるか、演算子がシフト演算子である場合、演算はx=(T)(x op y)として評価されます。ここで、Tはxのタイプですが、xは1回だけ評価されます。

•それ以外の場合、複合代入は無効であり、コンパイル時エラーが発生します

于 2011-01-02T07:58:41.463 に答える
5

最初の2つのサンプルがコンパイルされない理由は、次のとおりです。

  • キャストは減算よりも「緊密に」バインドします。つまり、「(C)de」は「(C)(de)」ではなく「((C)d)-e」を意味します。キャスト演算子の方が優先されます。
  • したがって、キャストに関係なく、減算の両方のオペランドのタイプはバイトです。
  • バイトに減算演算子が定義されていないため、減算のタイプはintです。
  • したがって、キャストなしで1バイトにintを割り当てることになりますが、これは不正です。

7を含むバイトがあり、そこから8を含むバイトを減算するとします。本当に、それを255バイトにしますか?ほとんどの人はそれをint-1にしたいと思うでしょう。

最後に、そもそもなぜこれをバイト単位で行っているのですか?これは意味がありません。C#では文字はバイトではありません。文字に対して算術演算を実行する場合は、損失が大きく危険なバイト変換を行う代わりに、文字'y'から 文字96を減算してみませんか?

于 2011-01-02T16:30:26.887 に答える
4

私も以前にこれに気づきました。これは、演算子がバイトタイプに対して事前定義されているためだと思います-=が、前者の場合、実際には、は許可されていないint内部に配置されています。byte彼らがこれを行った理由は必ずしも意味がありませんが、前者の場合、コンパイラーは-割り当てを行うときにオペレーターを「覗き見」できないため、ルールと一致しています。

あなたが本当に言う代わりに、1行で引く必要がある場合:

byte c7 = (byte)Upright[6] - ASC_OFFSET;

言う:

byte c7 = (byte)(Upright[6] - ASC_OFFSET);
于 2011-01-02T07:31:12.683 に答える