Deseamos brindarte la mejor respuesta que descubrimos en internet. Nosotros esperamos que te resulte de mucha ayuda y si puedes compartir algún detalle que nos pueda ayudar a perfeccionar nuestra información hazlo libremente.
Solución:
(int)foo
es simplemente un lanzamiento a la Int32
(int
en C#) tipo. Esto está integrado en el CLR y requiere que foo
ser una variable numérica (por ejemplo float
, long
etc.) En este sentido, es muy similar a un molde en C.
Convert.ToInt32
está diseñado para ser una función de conversión general. Hace mucho más que lanzar; es decir, puede convertir de ningún tipo primitivo a un int
(sobre todo, analizar un string
). Puede ver la lista completa de sobrecargas para este método aquí en MSDN.
Y como Stefan Steiger menciona en un comentario:
Además, tenga en cuenta que a nivel numérico,
(int) foo
truncafoo
(ifoo = Math.Floor(foo)
), tiempoConvert.ToInt32(foo)
usa la mitad para redondear (redondea x.5 al entero PAR más cercano, lo que significaifoo = Math.Round(foo)
). El resultado es, por lo tanto, no solo en términos de implementación, sino también numéricamente no lo mismo.
(esta línea se relaciona con una pregunta que se fusionó) Nunca debe usar (int)someString
– eso nunca funcionará (y el compilador no te lo permitirá).
Sin embargo, int int.Parse(string)
y bool int.TryParse(string, out int)
(y sus diversas sobrecargas) son un juego limpio.
Personalmente yo principalmente uso único Convert
cuando estoy lidiando con la reflexión, entonces para mí la elección es Parse
y TryParse
. La primera es cuando yo suponer el valor sea un entero válido, y quiero que arroje una excepción de lo contrario. La segunda es cuando quiero controlar si es un número entero válido, entonces puedo decidir qué hacer cuando lo es/no lo es.
Para citar este artículo de Eric Lippert:
Cast significa dos cosas contradictorias: “comprueba si este objeto realmente es de este tipo, tira si no lo es” y “este objeto no es del tipo dado; encuéntrame un valor equivalente que pertenezca al tipo dado”.
Entonces, lo que estaba tratando de hacer en 1.) es afirmar que sí, una Cadena es un Int. Pero esa afirmación falla ya que String no es un int.
La razón 2.) tiene éxito porque Convert.ToInt32() analiza el string y devuelve un int. Todavía puede fallar, por ejemplo:
Convert.ToInt32("Hello");
Daría como resultado una excepción Argumento.
En resumen, la conversión de String a Int es una preocupación del marco, no algo implícito en el sistema de tipo .Net.