Was ist der beste Ansatz, um die c # Unboxing Ausnahme zu lösen, wenn ein Objekt in einen Valuetype Gießen?
Frage
I umgewandelt nur einen Code-Snippet von VB.NET auf C # und stolperte über dieses Thema.
Betrachten Sie diesen Code ein:
Dim x As Integer = 5
Dim y As Object = x
Dim z As Decimal = CType(y, Decimal)
Kein Fehler von Compiler oder zur Laufzeit. z fünf.
Nun wollen wir diesen Code in C # übersetzen
int x = 5;
object y = x;
decimal z = (decimal)y;
Kein Fehler von Compiler aber zur Laufzeit eine Ausnahme ausgelöst:
Cannot unbox "y" to "decimal"
Nun meine Frage ist, was die klügste C # Weise sein würde, dies zu tun.
Zur Zeit mein Code wie folgt aussieht.
int x = 5;
object y = x;
decimal z = decimal.Parse(y.ToString());
Aber eine andere Lösung wäre:
decimal z = (decimal)(int)y;
Welche sieht ein bisschen verwirrend, aber propably hat weniger Overhead als Decimal.Parse, schätze ich.
Lösung
(decimal)(int)x
ist der richtige Weg, dies zu tun, wenn Sie das Box-Objekt erwarten eine ganze Zahl sein. Konvertieren in String und Parsen ist kein guter Weg, um das Problem zu attackieren und verursacht einige Overhead.
Wenn Sie nur das Objekt wissen umgewandelt werden kann in irgendeiner Weise zu decimal
, versuchen System.Convert.ToDecimal
Methode. Es wird damit umgehen, dass für Sie.
Andere Tipps
Wie wäre:
z = Convert.ToDecimal(y);
Convert.ToDecimal (y);
Wenn Sie absolut sicher sein wollen, könnten Sie versuchen:
int x = 5;
object y = x;
decimal z;
if (Decimal.TryParse(y.ToString(), out z))
{
// z is a decimal
}
else
{
// z is not a decimal
}
Auf diese Weise, wenn jemand setzt y = „Esel“ Sie es ohne Auslösen einer Ausnahme behandeln kann. Natürlich können Sie es vorziehen, eine Ausnahme zu werfen, wenn z nicht umgesetzt werden kann. Nur eine weitere Option ...