C# Cast / Convert von int to object Fehlerhaft wenn "?:"-Operator verwendet wird

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hallo zusammen,

mir ist gerade etwas seltsames aufgefallen und frage mich warum das so ist.
Das Netz hat mir leider bisher noch nicht weiter geholfen.

Und zwar bekomme ich in eine Methode einen Parameter vom Typ decimal. Dieser kann entweder eine Ganzzahl sein,
oder aber eine Dezimalzahl.
Den Parameter möchte ich bei einer Ganzzahl in einen Integer wandeln und dann als Object weiter geben.
Bei einer Dezimalzahl soll die Wandlung in einen Double Wert erfolgen und anschließen in einem Object verpackt werden.

Problem: Wenn ich mit dem "?:"-Operator arbeite bekomme ich im object IMMER eine Dezimalzahl.
Vereinfachte Darstellung:
Code:
static void Main(string[] args)
{
	decimal dDec = 2.0M;
	decimal dInt = 2;
	bool useInt = true;

	object x = useInt ? Convert.ToInt32(dInt) : Convert.ToDouble(dDec);
	Send(x);	// Hier wird '2.0' verschickt => FALSCH

	object y = Convert.ToDouble(dDec);
	if(useInt)
	{
		y = Convert.ToInt32(dInt);
	}
	Send(y);	// Hier wird '2' verschickt => RICHTIG
}

private static void Send(object obj)
{
	// ...
}
 
In Zeile 7 wird der Integer implizit zu einem Double gecastet. Dies liegt daran, dass dein Ausdruck nur einen (!) Rückgabewert haben kann. In diesem Fall ist der gemeinsame Nenner Double.

Versuch doch einfach mal Convert.ToInt32() und Convert.ToUInt32() in einem Ausdruck zu schreiben. Da wird der Compiler meckern, da es keine implizite Konvertierung von int nach uint gibt.

EDIT: Ansonsten besteht folgende Möglichkeit:

Code:
object x = useInt ? (object)Convert.ToInt32(dInt) : Convert.ToDouble(dDec);
oder
Code:
object x = useInt ? Convert.ToInt32(dInt) : (object)Convert.ToDouble(dDec);

Dann ist object der gemeinsame Nenner.
 
Zuletzt bearbeitet:
Zurück
Oben