Qual é a diferença entre Convert.ToInt32 e (int)?

O código a seguir lança um erro em tempo de compilation como

Não é possível converter o tipo ‘string’ para ‘int’

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

enquanto o código abaixo compila e executa com sucesso:

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

Eu gostaria de saber:

  1. Por que o primeiro código gera um erro de tempo de compilation?

  2. Qual é a diferença entre os dois trechos de código?

(int)foo é simplesmente convertido para o tipo Int32 ( int em C #). Isso é embutido no CLR e requer que foo seja uma variável numérica (por exemplo, float , long , etc.) Nesse sentido, é muito semelhante a uma conversão em C.

Convert.ToInt32 é projetado para ser uma function de conversão geral. Faz muito mais do que fundição; ou seja, ele pode converter de qualquer tipo primitivo para um int (mais notavelmente, analisando uma string ). Você pode ver a lista completa de sobrecargas para este método aqui no MSDN .

(esta linha refere-se a uma questão que foi mesclada) Você nunca deve usar (int)someString – isso nunca funcionará (e o compilador não permitirá).

No entanto, int int.Parse(string) e bool int.TryParse(string, out int) (e suas várias sobrecargas) são um jogo justo.

Pessoalmente, eu principalmente uso Convert apenas quando estou lidando com reflection, então para mim a escolha é Parse e TryParse . O primeiro é quando eu espero que o valor seja um inteiro válido, e quero que ele lance outra exceção. A segunda é quando eu quero verificar se é um inteiro válido – então posso decidir o que fazer quando é / não é.

Para citar este artigo de Eric Lippert :

Elenco significa duas coisas contraditórias: “verifique se este object é realmente desse tipo, lance se não for” e “esse object não é do tipo dado; encontre-me um valor equivalente que pertence ao tipo dado”.

Então o que você estava tentando fazer em 1.) é afirmar que sim uma String é um Int. Mas essa afirmação falha, pois String não é um int.

A razão 2.) é bem sucedida porque Convert.ToInt32 () analisa a cadeia e retorna um int. Ainda pode falhar, por exemplo:

 Convert.ToInt32("Hello"); 

Resultaria em uma exceção Argument.

Resumindo, a conversão de um String para um Int é uma preocupação do framework, não algo implícito no sistema do tipo .Net.

Você está falando sobre uma operação de conversão de C # vs utilitários de conversão .NET

  • C # A conversão em nível de linguagem usa parênteses – por exemplo, (int) – e o suporte à conversão é limitado, contando com compatibilidade implícita entre os tipos ou com instruções explicitamente definidas pelo desenvolvedor por meio de operadores de conversão .
  • Existem muitos methods de conversão no .NET Framework, por exemplo, System.Convert , para permitir a conversão entre tipos de dados iguais ou diferentes.

A syntax (Casting) funciona em tipos de dados numéricos e também em tipos de dados “compatíveis”. Compatível significa tipos de dados para os quais existe um relacionamento estabelecido por meio de inheritance (ou seja, classs base / derivadas) ou por meio de implementação (ou seja, interfaces).

A transmissão também pode funcionar entre tipos de dados diferentes que possuem operadores de conversão definidos.

A class System.Convert, por outro lado, é um dos muitos mecanismos disponíveis para converter as coisas no sentido geral; Ele contém lógica para converter entre tipos de dados diferentes, conhecidos, que podem ser alterados logicamente de um formulário para outro.

A conversão abrange até alguns dos mesmos fundamentos do casting, permitindo a conversão entre tipos de dados semelhantes.


Lembre-se de que a linguagem C # tem seu próprio jeito de fazer algumas coisas.
E o .NET Framework subjacente tem sua própria maneira de fazer as coisas, além de qualquer linguagem de programação.
(Às vezes eles se sobrepõem em suas intenções.)

Pense em converter como um recurso de nível de linguagem C # que é mais limitado por natureza e conversão através da class System.Convert como um dos muitos mecanismos disponíveis na estrutura .NET para converter valores entre diferentes tipos.

Uma string não pode ser convertida em um int por meio de conversão explícita. Deve ser convertido usando int.Parse .

Convert.ToInt32 basicamente envolve este método:

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

Não há uma conversão padrão de string para int no .NET. Você pode usar int.Parse () ou int.TryParse () para fazer isso. Ou, como você fez, você pode usar Convert.ToInt32 ().

No entanto, no seu exemplo, por que um ToString () e depois convertê-lo de volta para um int em tudo? Você poderia simplesmente armazenar o int em Session e recuperá-lo da seguinte forma:

 int i = Session["name1"]; 

Apenas um breve extra: em circunstâncias diferentes (por exemplo, se você está convertendo um double, & c para um Int32), você também pode querer se preocupar em arredondar ao escolher entre esses dois. Convert.Int32 usará o arredondamento do banqueiro ( MSDN ); (int) apenas truncará para um inteiro.

1) C # é uma linguagem segura e não permite que você atribua uma string a um número

2) segundo caso analisa a string para nova variável. No seu caso, se a session é session do asp.net do que você não tem que armazenar a seqüência lá e convertê-lo de volta ao recuperar

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

Convert.ToInt32

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

mas (int) é type cast, então (int) “2” não funcionará, já que você não pode converter string para int. mas você pode analisar como Convert.ToInt32 fazer

A diferença é que o primeiro snippet é um casting e o segundo é um convertido. Embora, eu acho que talvez o erro do compilador esteja fornecendo mais confusão aqui por causa do texto. Talvez fosse melhor se dissesse “Não é possível converter o tipo ‘string’ para ‘int’.

Isso é antigo, mas outra diferença é que (int) não completa os números caso você tenha um ej duplo: 5.7 a saída usando (int) será 5 e se você usar Convert.ToInt () o número será arredondar para 6.