2009-11-03 10 views
7

Estoy intentando depurar una aplicación que obtiene una InvalidCastException. La línea de falla es¿Por qué obtengo InvalidCastException al convertir un doble en decimal?

decimal d = (decimal)row[denominator]; 

inspección de esto en el depurador (ver imagen abajo), la fila [denominador] tiene un doble con valor de 8,0 por lo que yo puedo decir. ¿No debería haber problemas para convertirlo en un decimal?

(El tipo 'fila' es de 3. party library, que a su vez se llena a partir de datos de MySQL La cuestión arised cuando se prueba en un servidor previa de MySQL que al parecer vuelve algunos agregados como doble vs decimal en MySQL 5.1 -. Misma consulta, exactamente la misma copia de los datos en la base de datos)

Visual Studio Screenshot http://img18.imageshack.us/img18/3897/invaldicast.png

Cualquier ayuda en cómo podría investigar más a fondo esto?

+0

Lo que se devuelve parece ser un objeto que contiene un doble y no un doble directo. – Lazarus

Respuesta

10

Eric Lippert ha blogueado sobre exactamente esto en profundidad Estoy de acuerdo que es poco intuitivo al principio, pero él lo explica muy bien: Representation and Identity

3

que puede utilizar:

double d1 = (double)row[denominator]; 
decimal d = (decimal) d1; 

O, por supuesto, que acortará a:

decimal d = (decimal) (double)(row[denominator]); 

Debido a que es un paso unboxing involucrados, se necesitan de 2 pasos.

2

Primero intenta convertirlo a double. El row[denominator] está en caja, por lo que un molde directo a decimal no funcionará.

6

Es necesario echarlo a un doble por primera vez como row[denominator] es un doble en caja como un objeto decir

decimal d = (decimal)((double)row[denominator]); 
3

Una sugerencia: pruebe a utilizar Convert.ToDecimal() en lugar de colada directa.

4

me gustaría probar

decimal d = Convert.ToDecimal(row[denominator]); 

o

decimal d = 0; 
if (!decimal.TryParse(row[denominator], out d)) 
    //do something 
2

A juzgar por el mensaje de error y la descripción Asumo esa fila [denominador] es un doble caja, de modo de tipo de objeto. El desempaquetado solo se puede hacer con la datattype subyacente correcta, ya que el tiempo de ejecución no es ahora dónde encontrar el operador de conversión real de doble a decimal (en su caso, trata de encontrar un operador que convierta el objeto a decimal, pero ese es un operador unboxing y el tipo subyacente no es decimal Así que la manera correcta debería ser convertir primero a duplicar y luego a decimales:..

decimal d = (decimal)(double)row[denominator]; 
0

eso sí,

decimal d = Convert.ToDecimal(row[denominator]); 

de esta manera, no necesita preocuparse por todos los problemas de fundición.

Cuestiones relacionadas