Hallo,
Kann mir jemand den Unterschied der beiden unteren Ausdrücke erklären?
byte i=1;
i+=1; // Wird anstandslos ausgeführt
i=i+1; // Fehler (s.u.)
Fehlermeldung:
Der Typ 'int' kann nicht implizit in 'byte' konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
Das Literal "1" wird ja vom Compiler als int behandelt. Wenn ich dann einen int auf ein byte addieren möchte, habe ich einen Typkonflikt. Soweit so klar. Wieso wird es aber in der Form
i+=1;
anstandslos ausgeführt wohingegen
i=i+1;
nicht akzeptiert wird. Auch ein
i=i+(byte)1;
hilt nichts.
Danke für eure Hilfe,
Christof
wenn, dann so:
i=(byte) i+1;
Es muss heißen:
i=(byte)(i+1);
Das liegt daran das es keinen + Operator für bytes gibt, da diese nicht für Rechenoperationen gedacht sind. Das Problem ist also das dein byte zu einem int convertiert wird (nicht nur weil die Zahl als int interpretiert wird).
Du kannst keine 2 bytes addieren und einem byte zuweisen.
Warum jedoch += funktioniert weis ich nicht.
Hallo ChrisV,
die Antwort auf deine Frage ergibt sich aus folgenden Kapiteln der Sprach-Spezikation ECMA-334 sowie der C#-Referenz:
Es gibt also - wie Console32 sagt - überhaupt keinen Operator byte operator +(byte x, byte y)
und auch keinen int operator +(byte x, byte y)
und erst recht keinen byte operator +(int x, int y)
.
14.2.6.2 Binary numeric promotions
Stattdessen werden die Parameter nach der letzten Regel in ints convertiert (und dann entsprechend der Operator int operator +(int x, int y)
verwendet). Deswegen hilft es auch nicht, das Literal auf byte zu casten, weil es implizit sowieso wieder in einen int umgewandelt wird.
byte (C#-Referenz)
"Numerische Typen mit einer größeren Speichergröße, die keine Literale sind, können nicht implizit in byte konvertiert werden." Das Ergebnis der Additionsoperation ist ein int. Deshalb klappt die (anschließende) Zuweisung an ein byte nicht ohne explizite Konvertierung.
Zusammengesetzte Zuweisungen (wie +=) basieren zwar auf den passenden binären Operatoren (hier also +), aber das Ergebnis wird implizit auf den Typ des linken Operanden konvertiert.
herbivore
Ergänzend zu der Antwort von Console32:
7.13.2 Compound assignment (C#)
Das Verhalten kann man als Compiler-Feature betrachten.
byte b = 0;
b += x;
// Wird zu b = (byte)(b + x);
Es funktioniert nur, wenn der der Compiler garantieren kann, dass x zu einem Byte konvertiert werden kann, ohne dass Daten verloren gehen. Dies ist der Fall, wenn x ein Integer-Literal kleiner als 256 ist oder x als konstanter Integer definiert wurde und kleiner als 256 ist. Interessanterweise ist eine long-Konstante kleiner als 256 nicht gültig.
byte b = 0;
int x1 = 100;
const int x2 = 100;
b += 100; // Geht
b += x2; // Geht
b += x1; // Geht nicht
Wow. Vielen Dank für die ausführlichen, schnellen und erklärenden Antworten.
Gruß Christof