Qual è l'approccio migliore per risolvere l'unboxing eccezione c # in fase di lancio un oggetto a un ValueType?

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

  •  18-09-2019
  •  | 
  •  

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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top