Qual è l'approccio migliore per risolvere l'unboxing eccezione c # in fase di lancio un oggetto a un ValueType?
Domanda
Ho appena convertito un frammento di codice da VB.NET a C # e ci siamo imbattuti su questo problema.
Si consideri questo codice:
Dim x As Integer = 5
Dim y As Object = x
Dim z As Decimal = CType(y, Decimal)
Nessun errore dal compilatore o in fase di esecuzione. z è cinque.
Ora cerchiamo di tradurre questo codice per C #
int x = 5;
object y = x;
decimal z = (decimal)y;
Nessun errore da compilatore, ma in fase di esecuzione viene generata un'eccezione:
Cannot unbox "y" to "decimal"
Ora la mia domanda è, che sarebbe il più intelligente C # modo per farlo.
Al momento il mio codice è simile.
int x = 5;
object y = x;
decimal z = decimal.Parse(y.ToString());
Ma un'altra soluzione potrebbe essere:
decimal z = (decimal)(int)y;
che sembra un po 'di confusione, ma ha propably meno overhead di decimal.Parse, immagino.
Soluzione
(decimal)(int)x
è il modo giusto di farlo se ci si aspetta l'oggetto confezionato per essere un numero intero. Conversione in stringa e l'analisi non è un buon modo per affrontare il problema e comporta un certo overhead.
Se si sa solo l'oggetto può essere convertito in decimal
in qualche modo, provare il metodo System.Convert.ToDecimal
. Sarà gestire questo per voi.
Altri suggerimenti
Come su:
z = Convert.ToDecimal(y);
Convert.ToDecimal (y);
Se vuoi essere totalmente sicuri si potrebbe provare:
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
}
In questo modo se qualcuno pone y = "asino", è possibile gestire senza un'eccezione. Naturalmente, si può preferire di un'eccezione se z non può essere convertito. Solo un'altra opzione ...