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?
Respuesta
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.
+1 por exponer el problema real explícitamente: boxeo. – tvanfosson
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'. –
@AllonGuralnek Considerando que 'default double' es' 0', y 'default
uso de este
var val=Convert.ToDouble(value);
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);
¡¿De qué estás hablando ?! ¿Entonces no puedes hacer esto? flotar f = 0.0f; doble d = (doble) f; – Aliostad
@ 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. –
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
no se puede convertir un objeto arbitrario a double
.
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);
Entonces '(doble) ((float) value)' funcionaría, ya que está correctamente desempaquetado antes del reparto 'double'? – TeaDrivenDev
debería hacerlo, sí – winwaed
- 1. Problema Int to Double casting
- 2. ¿Qué pasa con DCOM?
- 3. ¿Qué pasa con gethostbyname?
- 4. ¿Qué pasa con Linq a SQL?
- 5. ¿Cómo convierto Double [] a double []?
- 6. casting nula a Int y doble en Scala
- 7. ¿Qué pasa con gemspec?
- 8. ¿Qué pasa con const?
- 9. ¿Qué pasa con el método jQuery Live?
- 10. ¿Qué pasa con el objeto DateTime?
- 11. ¿Qué pasa con el "Afx" en StdAfx.h?
- 12. ¿Qué pasa con el siguiente protocolo Clojure?
- 13. double double vs double
- 14. ¿Qué pasa con [UITableView reloadData]?
- 15. ¿Qué pasa con las encuestas?
- 16. ¿Qué pasa con `std :: set`?
- 17. ¿Qué pasa con DateTime.Parse (myString)?
- 18. ¿Qué pasa con mi scala.swing?
- 19. ¿Qué pasa con este URI?
- 20. ¿Qué pasa con setScaleX/setScaleY?
- 21. TemplateBinding con convertidor: ¿qué pasa?
- 22. Deserialización de JSON a PHP, ¿con casting?
- 23. T_INLINE_HTML? ¿Qué pasa con esto?
- 24. ¿Qué pasa con [A-Z] que significa [A-Za-z]?
- 25. Casting NSObject a NSString
- 26. ¿Qué pasa con static_cast con múltiples argumentos?
- 27. printf y double double
- 28. ¿Por qué usar Convert.ToInt32 sobre el casting?
- 29. ¿Por qué Math.Floor (Double) devuelve un valor de tipo Double?
- 30. Convertir void * a double
¿Algún otro detalle sobre el objeto 'value'? (en particular, su tipo real). – kennytm
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
¿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