¿Cuál es la mejor manera de resolver el c # unboxing excepción al lanzar un objeto a un valuetype?

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

  •  18-09-2019
  •  | 
  •  

Pregunta

Acabo de convertir un fragmento de código de VB.NET a C # y tropecé con este problema.

Considere este código:

    Dim x As Integer = 5
    Dim y As Object = x
    Dim z As Decimal = CType(y, Decimal)

No hay error de compilador o en tiempo de ejecución. z es de cinco.

Ahora vamos a traducir el código en C #

    int x = 5;
    object y = x;
    decimal z = (decimal)y;

No hay error del compilador, pero en tiempo de ejecución se produce una excepción:

    Cannot unbox "y" to "decimal"

Ahora mi pregunta es, lo que sería el más inteligente de C # forma de hacerlo.

En la actualidad mi código es el siguiente.

    int x = 5;
    object y = x;
    decimal z = decimal.Parse(y.ToString());

Sin embargo, otra solución sería:

    decimal z = (decimal)(int)y;

Lo que se ve un poco confuso, pero además probablemente tiene menos sobrecarga que decimal.Parse, supongo.

¿Fue útil?

Solución

(decimal)(int)x es la forma correcta de hacerlo si espera que el objeto en caja sea un entero. La conversión a la cadena y el análisis no es una buena manera de atacar el problema e incurre en alguna sobrecarga.

Si sólo conoce el objeto se puede convertir en decimal de alguna manera, pruebe el método System.Convert.ToDecimal. Se va a manejar eso para usted.

Otros consejos

¿Qué hay de:

z = Convert.ToDecimal(y);

Convert.ToDecimal (y);

Si quieres estar totalmente seguro que podría intentar:

    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
    }

De esta forma si alguien fija y a = "burro" que puede manejarlo sin lanzar una excepción. Por supuesto, es posible que prefiera una excepción si z no se puede convertir. Sólo otra opción ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top