2011-10-28 10 views
6

Esto funciona como se espera:¿Por qué este tipo de conversión causa un error?

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

Si bien esto arroja una InvalidCastException:

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

¿Por qué fracasan al elenco de una object cuando el tipo subyacente sigue siendo byte?

+3

Esta pregunta explora esto: http://stackoverflow.com/questions/5588073/generics-casting-and-value-types-why-is-this-illegal - en particular, la respuesta de Eric Lippert es buena lectura. –

+0

@MattGreer Eso responde exactamente a mi pregunta. – jelbourn

Respuesta

6

Porque byte tiene una conversión explícita a int, pero object no lo hace.

Si le dice al compilador de la object es realmente un byte, entonces será una vez más permitirá convertir explícitamente a int.

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

Referencias:

Casting and Type Conversions
byte

+0

ah, solo quería responder eso: P – Rob

0

usted debe obtener primero el byte del objeto antes de poder convertir en un número entero.

Algo como esto:

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

Esto es causado por el uso de los CLR boxing and unboxing. Siempre que trate un tipo de valor como un objeto, el CLR automáticamente insertará este tipo de valor dentro de un objeto. El CLR sin embargo, sólo admite objetos en caja unboxing en su tipo de valor original como por MSDN:

Unboxing

Unboxing es una conversión explícita del objeto de tipo a un tipo de valor o de un tipo de interfaz a un tipo de valor que implementa la interfaz . Una operación unboxing consiste en:

  • Comprobación de la instancia de objeto para asegurarse de que es un valor en caja del tipo valor dado.

  • Copia del valor de la instancia en la variable de tipo de valor.

object o = b; Hace que el CLR para creado un byte en caja y lo almacena en O como un objeto. var i = (int)o; luego intenta desempaquetar el byte encuadrado en un int. Esto causa una excepción ya que el tipo en caja (byte) y el tipo de valor (int) son diferentes.

Cuestiones relacionadas