ここで 2 つの質問があります。1 つ目は、「なぜ short と short を足すと int になるのか」です。
では、short に short を加えたものが short であると仮定して、何が起こるか見てみましょう。
short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;
そしてもちろん、この計算がショートで行われた場合、平均は -9845 です。合計は可能な最大のショートよりも大きいため、負の値にラップアラウンドし、負の数を除算します。
整数演算がラップアラウンドする世界では、通常の計算がオーバーフローしないように十分な範囲を持つ可能性が高い型である int ですべての計算を行う方がはるかに賢明です。
2 番目の質問は次のとおりです。
- short プラス short は int です
- int を short に代入することは違法です
- a +=b は a = a + b と同じです
- したがって、ショート += ショートは違法である必要があります
- では、なぜこれが合法なのですか?
質問の前提が間違っています。上の 3 行目は間違っています。セクション7.17.2のC#仕様の状態
それ以外の場合、選択された演算子が事前定義された演算子であり、選択された演算子の戻り値の型が x の型に明示的に変換可能であり、y が x の型に暗黙的に変換可能であるか、演算子がシフト演算子である場合、演算はx = (T)(x op y) として評価されます。ここで、T は x の型ですが、x は 1 回だけ評価されます。
コンパイラが代わりにキャストを挿入します。正しい理由は次のとおりです。
- short プラス short は int です
- int を short に代入することは違法です
- s1 += s2 は s1 = (short)(s1 + s2) と同じです。
- したがって、これは合法であるべきです
キャストが挿入されない場合、多くの型で複合代入を使用することは不可能です。