2010-10-17 12 views

risposta

59

Un valore inserito può essere rimosso solo da una variabile dello stesso tipo. Questa restrizione apparentemente strana è una ottimizzazione della velocità molto importante che ha reso possibile la realizzazione di .NET 1.x prima che i farmaci generici fossero disponibili. Puoi leggere ulteriori informazioni a riguardo in this answer.

Non è necessario passare attraverso il cast multiplo, i tipi di valore semplice implementano l'interfaccia IConvertible. Che si richiama utilizzando la classe Convert:

 object o = 12m; 
     int ix = Convert.ToInt32(o); 
+0

Molto dolce! Mi stavo rovinando la testa sin dal mattino su questo. – RBT

15

Quando si esegue questa operazione, si sta implicitamente boxe decimale d a un oggetto di base:

object o = d; 

Non puoi lanciare valori incasellati direttamente senza prima li unboxing, ecco perché il casting diretto su un int, come nel seguente, fallisce:

int x = (int)o; 

Tuttavia, in questo modo (intermedia colata ad un primo decimale):

int x = (int)(decimal)o; 

Sei primo unboxing o, il che significa che si sta recuperando il valore decimale, quindi casting del valore decimale unboxed a un int, che funziona perché C# supporta il cast dei decimali in pollici.

6

decimal ha un explicit cast operator a int. object non lo fa:

decimal d = 10m; 
object o = d; 
int x = (int)d; // OK, calls decimal.explicit operator int(d). 
int y = (int)o; // Invalid cast. 
3

Quello che dovete pensare è che la boxe e unboxing non è esattamente un tipo di conversione. Si "avvolge" semplicemente il tipo di oggetto "attorno" al tipo decimale iniziale. Questo è il motivo per cui devi prima rimuovere l'oggetto, prima che tu possa convertirlo in un numero intero.