2010-10-17 16 views

Respuesta

59

El valor de un recuadro solo se puede desagrupar en una variable del mismo tipo. Esta restricción aparentemente extraña es una optimización de velocidad muy importante que hizo .NET 1.x factible antes de que los genéricos estuvieran disponibles. Puede leer más al respecto en this answer.

No tiene que saltar a través del bastidor moldeado múltiple, los tipos de valores simples implementan la interfaz IConvertible. La cual se invoca mediante la clase Convert:

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

¡Muy dulce! Estaba destrozando mi cabeza desde la mañana en esto. – RBT

15

Al hacer esto, usted está implícita boxeo del punto decimal d a un objeto básico:

object o = d; 

No se puede convertir valores en caja directamente sin primero desempaquetarlos, que es la razón por la cual el lanzamiento directo a un int, como en el siguiente, falla:

int x = (int)o; 

Sin embargo, al hacer esto (fundición de forma intermedia a un primer decimal):

int x = (int)(decimal)o; 

se intenta por primera unboxing o, lo que significa que está trayendo el valor decimal, entonces conversión del valor decimal sin embalaje a un int, que funciona porque C# admite el lanzamiento de decimales a ints.

6

decimal tiene explicit cast operator en . object no:

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

Lo que hay que pensar en este caso es que el boxeo y unboxing no es exactamente un tipo de conversión. Simplemente "ajusta" el tipo de objeto "alrededor" del tipo decimal inicial. Es por eso que primero debe desagrupar el objeto, antes de poder convertirlo a un número entero.

Cuestiones relacionadas