Hier gibt es zwei Fragen. Das erste ist "Warum ist kurz plus kurzes Ergebnis in int?"
Angenommen, kurz plus kurz war kurz und sehen, was passiert:
short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;
Und der Durchschnitt liegt natürlich bei -9845, wenn diese Berechnung in kurzen Abständen durchgeführt wird. Die Summe ist größer als der größtmögliche Short, daher wird sie negativ und Sie teilen die negative Zahl.
In einer Welt, in der sich ganzzahlige Arithmetik umgibt, ist es viel sinnvoller, alle Berechnungen in int durchzuführen, einem Typ, der wahrscheinlich genug Reichweite hat, damit typische Berechnungen nicht überlaufen.
Die zweite Frage lautet:
- kurz plus kurz ist int
- Das Zuweisen von int zu short ist illegal
- a + = b ist dasselbe wie a = a + b
- daher sollte short + = short illegal sein
- Warum ist das legal?
Die Frage hat eine falsche Prämisse; Die dritte Zeile oben ist falsch. Die C # -Spezifikation lautet in Abschnitt 7.17.2
Andernfalls, wenn der ausgewählte Operator ein vordefinierter Operator ist, wenn der Rückgabetyp des ausgewählten Operators explizit in den Typ x konvertierbar ist und wenn y implizit in den Typ x konvertierbar ist oder der Operator ein Schichtoperator ist, dann ist die Operation wird bewertet als x = (T) (x op y), wobei T der Typ von x ist, außer dass x nur einmal ausgewertet wird.
Der Compiler fügt die Besetzung in Ihrem Namen ein. Die richtige Begründung lautet:
- kurz plus kurz ist int
- Das Zuweisen von int zu short ist illegal
- s1 + = s2 ist dasselbe wie s1 = (kurz) (s1 + s2)
- Daher sollte dies legal sein
Wenn die Besetzung nicht für Sie eingefügt würde, wäre es unmöglich, die zusammengesetzte Zuweisung für viele Typen zu verwenden.