Qual é a melhor abordagem para resolver o c unboxing exceção quando lançando um objeto para um valuetype #?

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

  •  18-09-2019
  •  | 
  •  

Pergunta

Eu só converteu um trecho de código VB.NET para C # e tropeçou sobre esta questão.

Considere este código:

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

No erro do compilador ou em tempo de execução. z é de cinco.

Agora vamos traduzir este código para C #

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

No erro do compilador, mas em tempo de execução é emitida uma excepção:

    Cannot unbox "y" to "decimal"

Agora, a minha pergunta é, o que seria o mais inteligente C # maneira de fazer isso.

Atualmente meus olhares de código semelhantes.

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

Mas outra solução seria:

    decimal z = (decimal)(int)y;

O que parece um pouco confuso, mas propably tem menos sobrecarga do que Decimal.Parse, eu acho.

Foi útil?

Solução

(decimal)(int)x é a maneira certa de fazer isso, se você espera que o objeto em caixa para ser um inteiro. Convertendo para string e análise não é uma boa maneira de atacar o problema e incorre em alguma sobrecarga.

Se você acabou de conhecer o objeto pode ser convertido para decimal, de alguma forma, tente método System.Convert.ToDecimal. Ele vai lidar com isso para você.

Outras dicas

Como sobre: ??

z = Convert.ToDecimal(y);

Convert.ToDecimal (y);

Se você quiser ser totalmente seguro, você pode tentar:

    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
    }

Dessa forma, se alguém conjuntos y to = "burro" você pode lidar com isso sem lançar uma exceção. Claro, você pode preferir lançar uma exceção se z não podem ser convertidas. Apenas uma outra opção ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top