2011-10-28 13 views
6

Questo funziona come previsto:Perché questo typecast causa un errore?

byte b = 7; 
var i = (int)b; 

Mentre questo getta un InvalidCastException:

byte b = 7; 
object o = b; 
var i = (int)o; 

Perché il cast non riescono da un object quando il tipo di fondo è ancora byte?

+3

Questa domanda esplora questo: http://stackoverflow.com/questions/5588073/generics-casting-and-value-types-why-is-this-llegal - in particolare la risposta di Eric Lippert è una buona lettura. –

+0

@MattGreer Che risponde esattamente alla mia domanda. – jelbourn

risposta

6

Perché byte ha una conversione esplicita a int, ma non object.

Se dite al compilatore del object è davvero un byte, allora sarà ancora una volta permetterà di lanciare esplicitamente int.

byte b = 7; 
object o = b; 
var i = (int)((byte)o); 

Riferimenti:

Casting and Type Conversions
byte

+0

ah, volevo solo rispondere: P – Rob

0

è necessario innanzitutto ottenere il byte dall'oggetto prima di poter convertire i in un numero intero.

Qualcosa di simile a questo:

var i = (int)(byte)o; 
1

questo è causato dall'uso di CLR boxing and unboxing. Ogni volta che trattate un tipo di valore come oggetto, il CLR imposterà automaticamente questo tipo di valore all'interno di un oggetto. Il CLR tuttavia supportano solo oggetti scatolari unboxing nella loro tipo di valore originale secondo MSDN:

Unboxing

unboxing è una conversione esplicita dall'oggetto tipo di un tipo di valore o da un tipo di interfaccia un tipo di valore che implementa l'interfaccia . Un'operazione unboxing composto da:

  • Leggere l'istanza di oggetto per assicurarsi che sia un valore scatola del valore dato tipo.

  • Copia del valore dall'istanza nella variabile valore-tipo.

object o = b; Provoca il CLR a creato un byte in scatola e lo memorizza in o come un oggetto. var i = (int)o; quindi tenta di rimuovere il byte in box in un int. Ciò provoca un'eccezione in quanto il tipo di box (byte) e il tipo di valore (int) differiscono.

Problemi correlati