C# komisches Problem

Fhat the Wuck

Lieutenant
🎅Rätsel-Elite ’24
Registriert
Feb. 2009
Beiträge
679
Hallo zusammen.

Ich habe ein Problem:

Hier der Code
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operatoren
{
    class Program
    {
        static void Main(string[] args)
        {
            short srtVar1 = 30;
            short srtVar2 = 55;
            short srtResult = srtVar1 + srtVar2;
        }
    }
}

Und hier die Fehlermeldung:
Fehler 1 Der Typ "int" kann nicht implizit in "short" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)

Die Fehlermeldung verweist auf:
short srtResult = srtVar1 + srtVar2;

Was habe ich hier vergessen?
Ich wette es sicher etwas kleines, aber bisher bin ich noch nicht dahintergekommen.

MfG
LuXon
 
Hallo LuXon,

du musst eine explizite Typenumwandlung durchführen

Code:
short srtResult = (short)(srtVar1 + srtVar2);

//Kalleberlin
 
Danke für die Antwort.
Was ich aber daran nicht begreiffe: ich habe ja alles (!) als short initialisiert. Warum muss ich das nochmal machen?

MfG
LuXon
 
Weil sich irgendwer gedacht hat, es wäre schlau das Ergebnis der Addition in dem nächstgrößeren Datentyp abzuspeichern, der auf jeden Fall das Ergebnis der Addition aufnehmen kann(in diesem Fall wäre das int). Klingt erstmal sinnvoll, leider hat man nicht weiter als bis ulong gedacht, da ist das nicht mehr so. Da gibt das nichtmal einen Fehler.
 
ah. Interessant.

Habe mir ein Buch gekauft, aber nicht steht darüber drin.^^

Aber danke dass ich es jetzt weiss

MfG
LuXon
 
Darii schrieb:
Weil sich irgendwer gedacht hat, es wäre schlau das Ergebnis der Addition in dem nächstgrößeren Datentyp abzuspeichern, der auf jeden Fall das Ergebnis der Addition aufnehmen kann(in diesem Fall wäre das int). Klingt erstmal sinnvoll, leider hat man nicht weiter als bis ulong gedacht, da ist das nicht mehr so. Da gibt das nichtmal einen Fehler.

Das ist Unsinn! Der Grund ist ein anderer. Wenn das was du sagst stimmen würde, würde man auch bei

Code:
int srtVar1 = 2147483647;
int srtVar2 = 55;
int srtResult = srtVar1 + srtVar2;

einen Fehler erhalten, was nicht der Fall ist. Stattdessen gibt es einen glasklaren Überlauf ohne Warnung.

LuXon schrieb:
Was ich aber daran nicht begreiffe: ich habe ja alles (!) als short initialisiert. Warum muss ich das nochmal machen?

Das liegt daran, dass der rechte Teil des Ausdrucks

Code:
short srtResult = srtVar1 + srtVar2;

also

srtVar1 + srtVar2

automatisch in einen Int32 (int) konvertiert wird. Das nennt sich implizite Typumwandlung.

Anschließend erfolgt die Zuweisung. Da aber srtResult vom Typ short ist, somit kleiner als ein int, wirft der Compiler einen Fehler.

Wenn du dir die Überladung des + Operators in C# ansiehst, siehst du folgendes.

int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);

Für short gibt es also gar keine definierte Addition. Stattdessen wird bei der Addition von short automatisch einer der vier Überladungen von + aufgerufen, also mindestens in einen int konvertiert und dieser wird auch zurückgegeben. Deshalb liefert

srtVar1 + srtVar2

einen int zurück.

Würdest du

Code:
short srtVar1 = 30;
long srtVar2 = 55;
int srtResult = srtVar1 + srtVar2;

schreiben, wäre das auch falsch, weil der Compiler bei der Addition die Überladung

Code:
long operator +(long x, long y)

aufrufen würde und damit einen long zurückgeben würde.

Zusammenfassend bedeutet das also, bei der Addition wird immer die Überladung aufgerufen, die den größten bei der Addition vorkommenden Datentypen eines Operanden besitzt, aber mindestens int.
 
Zuletzt bearbeitet:
ah danke.

Ich denke ich habe dies jetzt begriffen. Wenn ich wieder eine solche Frage, dann kann ich mich ja sicher an dich wenden. oder?

MfG
LuXon
 
Wenn du wieder so eine Frage hast, mach bitte einfachen einen neuen Thread auf. Dann haben alle, die jetzt oder später die gleiche Frage haben auch was davon. :)
So gute Erklärungen sollte man der Community nicht vorenthalten.
 
Stefan_Sch schrieb:
Darii schrieb:
Weil sich irgendwer gedacht hat, es wäre schlau das Ergebnis der Addition in dem nächstgrößeren Datentyp abzuspeichern, der auf jeden Fall das Ergebnis der Addition aufnehmen kann(in diesem Fall wäre das int). Klingt erstmal sinnvoll, leider hat man nicht weiter als bis ulong gedacht, da ist das nicht mehr so. Da gibt das nichtmal einen Fehler.
Das ist Unsinn! Der Grund ist ein anderer. Wenn das was du sagst stimmen würde, würde man auch bei
Ja nicht das Ergebnis der Addition, sondern die Werte beider Operanden, hatte ich falsch gelesen.

Also nochmal die Originalquelle damit alle Missverständnisse ausgeräumt werden:
C# Spezifikation schrieb:
For the binary +, –, *, /, %, &, ^, |, ==, !=, >, <, >=, and <= operators, the operands are converted to type T, where T is the first of int, uint, long, and ulong that can fully represent all possible values of both operands. The operation is then performed using the precision of type T, and the type of the result is T (or bool for the relational operators). It is not permitted for one operand to be of type long and the other to be of type ulong with the binary operators.
 
Zuletzt bearbeitet:
Zurück
Oben