Qual é a melhor abordagem para resolver o c unboxing exceção quando lançando um objeto para um valuetype #?
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.
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 ...