¿Cuál es la diferencia entre Convert.ToInt32 y (int)?

El siguiente código arroja un error en tiempo de comstackción como

No se puede convertir el tipo ‘cadena’ a ‘int’

string name = Session["name1"].ToString(); int i = (int)name; 

mientras que el siguiente código comstack y ejecuta con éxito:

 string name = Session["name1"].ToString(); int i = Convert.ToInt32(name); 

Me gustaría saber:

  1. ¿Por qué el primer código genera un error en tiempo de comstackción?

  2. ¿Cuál es la diferencia entre los 2 fragmentos de código?

(int)foo es simplemente un lanzamiento al tipo Int32 ( int en C #). Esto está integrado en el CLR y requiere que sea una variable numérica (por ejemplo, float , long , etc.) En este sentido, es muy similar a un elenco 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 cualquier tipo primitivo a int (más notablemente, analizar una string ). Puede ver la lista completa de sobrecargas para este método aquí en MSDN .

(esta línea se relaciona con una pregunta que se fusionó) Nunca debe usar (int)someString ; eso nunca funcionará (y el comstackdor no le permitirá).

Sin embargo, int int.Parse(string) y bool int.TryParse(string, out int) (y sus varias sobrecargas) son juego limpio.

Personalmente, principalmente uso Convert cuando estoy tratando con la reflexión, por lo que para mí, la opción es Parse y TryParse . El primero es cuando espero que el valor sea un número entero válido, y quiero que arroje una excepción de lo contrario. El segundo es cuando quiero verificar si es un número entero válido; entonces puedo decidir qué hacer cuando es / no es.

Para citar de este artículo de Eric Lippert :

Elenco significa dos cosas contradictorias: “verifique si este objeto es realmente de este tipo, arroje si no es así” y “este objeto no es del tipo dado, encuéntreme un valor equivalente que pertenezca al tipo dado”.

Entonces, lo que estabas 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.

El motivo 2.) tiene éxito es porque Convert.ToInt32 () analiza la cadena y devuelve un int. Todavía puede fallar, por ejemplo:

 Convert.ToInt32("Hello"); 

Ocasionaría una excepción de Argument.

En resumen, la conversión de un String a un Int es una preocupación marco, no algo implícito en el sistema de tipo .Net.

Estás hablando de una operación de conversión C # contra utilidades de Conversión .NET

  • C # La conversión de nivel de idioma utiliza paréntesis, por ejemplo, (int), y el soporte de conversión para ella es limitado, dependiendo de la compatibilidad implícita entre los tipos, o las instrucciones explícitamente definidas por el desarrollador a través de los operadores de conversión .
  • Existen muchos métodos de conversión en .NET Framework, por ejemplo, System.Convert , para permitir la conversión entre tipos de datos iguales o dispares.

La syntax (Casting) funciona en tipos de datos numéricos y también en tipos de datos “compatibles”. Compatible significa tipos de datos para los cuales existe una relación establecida a través de la herencia (es decir, clases base / derivadas) o mediante la implementación (es decir, interfaces).

La conversión también puede funcionar entre tipos de datos dispares que tienen operadores de conversión definidos.

La clase System.Convert por otro lado es uno de los muchos mecanismos disponibles para convertir cosas en el sentido general; contiene lógica para convertir entre tipos de datos dispares, conocidos, que se pueden cambiar lógicamente de una forma a otra.

La conversión incluso cubre parte del mismo terreno que la conversión permitiendo la conversión entre tipos de datos similares.


Recuerde que el lenguaje C # tiene su propia forma de hacer algunas cosas.
Y el .NET Framework subyacente tiene su propia forma de hacer las cosas, aparte de cualquier lenguaje de progtwigción.
(A veces se superponen en sus intenciones)

Piense en el casting como una característica de nivel de lenguaje C # que es de naturaleza más limitada, y la conversión a través de la clase System.Convert como uno de los muchos mecanismos disponibles en .NET Framework para convertir valores entre diferentes tipos.

Una cadena no se puede convertir a un int a través de un casting explícito. Debe convertirse utilizando int.Parse .

Convert.ToInt32 básicamente envuelve este método:

 public static int ToInt32(string value) { if (value == null) { return 0; } return int.Parse(value, CultureInfo.CurrentCulture); } 

No hay un molde predeterminado de cadena a int en .NET. Puede usar int.Parse () o int.TryParse () para hacer esto. O, como lo ha hecho, puede usar Convert.ToInt32 ().

Sin embargo, en su ejemplo, ¿por qué hacer un ToString () y luego convertirlo de nuevo a un int? Simplemente puede almacenar el int en Session y recuperarlo de la siguiente manera:

 int i = Session["name1"]; 

Solo un breve extra: en diferentes circunstancias (por ejemplo, si está convirtiendo un doble, & c en un Int32), también podría querer preocuparse por el redondeo al elegir entre estos dos. Convert.Int32 usará el redondeo bancario ( MSDN ); (int) simplemente truncará a un entero.

1) C # es un tipo de lenguaje seguro y no le permite asignar una cadena al número

2) segundo caso analiza la cadena a la nueva variable. En su caso, si la sesión es de ASP.NET, entonces no tiene que almacenar una cadena allí y convertirla al recuperar

 int iVal = 5; Session[Name1] = 5; int iVal1 = (int)Session[Name1]; 

Convert.ToInt32

     return int.Parse (value, CultureInfo.CurrentCulture);

pero (int) es un tipo de conversión, por lo que (int) “2” no funcionará, ya que no puede convertir cadena a int. pero puedes analizarlo como Convert.ToInt32 do

La diferencia es que el primer fragmento es un elenco y el segundo es un convertido. Aunque, creo que quizás el error del comstackdor está proporcionando más confusión aquí debido a la redacción. Tal vez sería mejor si dijera “No se puede enviar el tipo ‘cadena’ a ‘int’.

Esto es antiguo, pero otra diferencia es que (int) no redondea los números en caso de que tenga un ej doble: 5.7 la salida que usa (int) será 5 y si usa Convert.ToInt () el número será redondea a 6.