System.Convert.ToInt frente a (int)
Pregunta
Noté en otra publicación que alguien había hecho algo como:
double d = 3.1415;
int i = Convert.ToInt32(Math.Floor(d));
¿Por qué usaron la función de conversión, en lugar de:
double d = 3.1415;
int i = (int)d;
que tiene un piso implícito y convierte.
Además, lo que es más preocupante, noté en algún código de producción que estaba leyendo:
double d = 3.1415;
float f = Convert.ToSingle(d);
¿Es lo mismo que:
float f = (float)d;
¿Todas esas conversiones implícitas están solo en la clase Convertir para que estén completas, o tienen un propósito?Puedo entender la necesidad de .ToString(), pero no el resto.
Solución
La conversión a int es un truncamiento implícito, no un piso implícito:
double d = -3.14;
int i = (int)d;
// i == -3
Elijo Math.Floor o Math.Round para hacer mis intenciones más explícitas.
Otros consejos
El redondeo también se maneja de manera diferente:
x=-2.5 (int)x=-2 Convertir.ToInt32(x)=-2
x=-1.5 (int)x=-1 Convertir.ToInt32(x)=-2
x=-0.5 (int)x= 0 Convertir.ToInt32(x)= 0
x= 0.5 (int)x= 0 Convertir.ToInt32(x)= 0
x= 1.5 (int)x= 1 Convertir.ToInt32(x)= 2
x= 2.5 (int)x= 2 Convertir.ToInt32(x)= 2
Observe los casos x=-1,5 y x=1,5.
En algunos algoritmos, el método de redondeo utilizado es fundamental para obtener la respuesta correcta.
Puedes usar Convertir cuando tengas una cadena que quieras convertir a un int
int i = Convert.ToInt32("1234");
Tanto la conversión como la conversión generarán una excepción si fallan.
es decir, esto seguirá generando una excepción, no devolverá 0:
Convert.ToInt32("1234NonNumber");
En muchos casos, la conversión y la conversión tendrán el mismo resultado, pero una conversión suele ser más fácil de leer.
Convert.ToInt32() se usa en cadenas (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx) mientras que la conversión solo se puede utilizar en tipos que tienen convertidores internos (tipos numéricos).El verdadero truco consiste en decidir entre Int32.Parse y Convert.ToInt32().Convert.ToInt32() tolera un parámetro nulo y devuelve 0, mientras que Int32.Parse() arrojará una ArgumentNullException.