2010-11-06 7 views
24

Tengo InvalidCastException cuando trato de convertir 0.0 a doble, ¿por qué es así? Está bien cuando hago (float)value en su lugar.¿Qué pasa con el casting 0.0 a double?

alt text

+0

¿Algún otro detalle sobre el objeto 'value'? (en particular, su tipo real). – kennytm

+1

Echa un vistazo a la publicación del blog de Eric Lippert sobre este tema: http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – Ani

+0

¿Hay alguna razón por la que pareces reinventar la rueda? .NET ya tiene una clase que le permite convertir objetos de un tipo a otro. – tvanfosson

Respuesta

59

En general, cuando se pone un tipo de valor en un object (llamado boxeo) que necesita para unbox se al exactamente el mismo tipo de valor. No puede hacer una conversión a otro tipo en su lugar. Esto es lo que sucede aquí.

Si realmente desea convertir el objeto, primer necesita para ponerlo en la caja. Digamos que su valor original era un float antes en caja en un object:

double d = (double) (float) value; 

O utilice el método propuesto por otros, que utiliza Convert. Esto tiene la ventaja de que no es necesario conocer el tipo original.

+13

+1 por exponer el problema real explícitamente: boxeo. – tvanfosson

+5

Advertiría que usar 'Convert' no es equivalente al doble casting anterior, ya que si el objeto convertido es' null', 'Convert' silenciosamente devolverá cero, mientras que el doble casting fallará en el primer molde, como es de esperar que ocurra a partir de cualquier valor no flotante, como 'null'. Recuerde, 'null' no es' 0', pero sí con 'Convert'. –

+0

@AllonGuralnek Considerando que 'default double' es' 0', y 'default ' es 'null',' Convert' es más o menos equivalente al llamado safe-cast 'as', aunque no lo es Es igual de seguro. – jpaugh

3

uso de este

var val=Convert.ToDouble(value); 
11

eso es normal. Si el tipo de objeto es float no puede echarlo a double porque no son del mismo tipo:

object o = 1.0f; 
double d = (double)o; // will throw an exception 

es necesario convertir que:

double d = Convert.ToDouble(o); 
+3

¡¿De qué estás hablando ?! ¿Entonces no puedes hacer esto? flotar f = 0.0f; doble d = (doble) f; – Aliostad

+1

@ Aliostad, puedes hacer eso. No puede hacer lo que mostré en mi respuesta: lanzar un objeto (cuyo tipo es flotante) al doble, que es lo que el OP intenta hacer. –

+6

su explicación es confusa porque no distingue entre el tipo de objeto subyacente (float) y el tipo de variable (objeto) y menciona explícitamente el boxeo. Como señala @Aliostad, podría interpretarse que significa que no se puede subir un flotante (unboxed) a un doble, lo cual es claramente falso. – tvanfosson

3

no se puede convertir un objeto arbitrario a double.

4

El flotador se ha puesto en la caja como un objeto. Entonces estás tratando de convertir un flotador en caja en un doble. Utilice convertido de Vyas lugar - es mucho más flexible y siempre debe hacer lo correcto:

var val=Convert.ToDouble(value); 
+1

Entonces '(doble) ((float) value)' funcionaría, ya que está correctamente desempaquetado antes del reparto 'double'? – TeaDrivenDev

+0

debería hacerlo, sí – winwaed