Was ist der beste Ansatz, um die c # Unboxing Ausnahme zu lösen, wenn ein Objekt in einen Valuetype Gießen?

StackOverflow https://stackoverflow.com/questions/1153612

  •  18-09-2019
  •  | 
  •  

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.

War es hilfreich?

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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top