Pergunta

eu quero saber typecasting em c # .net, tenho linhas de código abaixo.

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.

então eu quero saber por que string s = i and string s = (string)i não funciona e qual a diferença em usar (string)i, i.ToString(), and Convert.ToString(i).

Foi útil?

Solução

Quando se trata de boxe e unboxing, os tipos têm conversão explícita e implícita.Portanto, em algumas circunstâncias, é fácil para o tempo de execução permitir a conversão implícita entre dois tipos suportados, digamos, um Int32 para um Double.No entanto, não há conversão implícita ou explícita entre um inteiro e uma string, porque obviamente uma string não é um inteiro (apesar do fato de uma string poder conter caracteres para um inteiro).

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion

Isso e onde Convert vem brincar. Convert contém suporte para tentar converter primitivos conhecidos (e tipos que suportam IConvertable) para outro.Então, ToString ou Convert.ToString seriam os métodos preferidos (ToString e Convert.ToString são praticamente sinônimos, exceto que ToString oferece algumas opções de formatação).

Outras dicas

Bem, string e object - ambos são tipos de referência.No entanto, object é um tipo raiz para todos os tipos .NET.

Quando você usa uma sintaxe como (string)i, você está tentando usar conversão explícita entre tipos.Mas este tipo de conversão requer string class para saber sobre todos os tipos de argumentos possíveis.

Então nós temos .ToString() método, que pode ser substituído em qualquer classe, e seu valor de retorno é usado como uma representação de string de qualquer objeto.

string s = i e string s = (string)i não funciona

pois I não é uma string, e o tipo CASTING é um CAST do tipo, não uma conversão.Só funciona se i contiver uma string ou uma subclasse de string (o que não é possível para strings, mas pode ser para outras classes).

qual é a diferença em usar (string)i, i.ToString() e Convert.ToString(i).

  • (string) eu:converter i em uma string, deve ser atribuível.

  • i.ToString():chama o método ToSstring, que é definido em System.object, portanto disponível em TODAS as classes e estruturas - mas não retorna nenhum conteúdo sensato se não for substituído.

  • Converter.ToString(i):converte i em uma string.Isso inclui chamar um conversor que provavelmente chama apenas ToString neste caso raro.

No final das contas, o casting não é uma conversão.para (string) i funcionar, TEM QUE SER UMA STRING, enquanto convert tenta torná-lo uma string.

Você pode especificar conversões implícitas e explícitas em .net. O motivo pelo qual string s = i falha é que não há operação de conversão integrada de um número inteiro em uma string.

Veja isso Artigo MSDN no elenco para mais informações

string s= i não funciona porque os tipos não correspondem, int não entra em uma string.

string s=(string)i não funciona porque não pode assumir qual conversão de tipo será usada (ou seja, qual base)

algo como s = ""+i funcionaria, por outro lado, pois assumiria a conversão de base 10.

então eu quero saber por que string s = i e string s = (string)i não funciona

A resposta curta é que não há conversão implícita (primeiro exemplo acima) nem explícita (segundo exemplo acima) de int para string definida.Resposta um pouco mais longa;ao criar a estrutura Int32 em C# nenhum comportamento de conversão foi programado para permitir ao desenvolvedor converter automaticamente de um int para uma string

qual a diferença em usar (string)i, i.ToString(), e Convert.ToString(i)

Bem, o primeiro não funciona como você disse e como expliquei acima.O segundo chama o ToString método na estrutura Int32, que retorna (como o nome indica) uma representação em string do objeto.Deve-se notar que esta é uma string totalmente nova, não relacionada de forma alguma ao valor original.O terceiro exemplo Convert.ToString irá, nos bastidores, chamar a maneira mais apropriada de transformar o parâmetro passado em uma string - provavelmente apenas chama o ToString método - praticamente idêntico ao exemplo 2.

ToString() O método é substituído por cada referência que é o método virtual na classe do objeto.string calss substitui esse método e fornece valor de string a partir disso.

A implementação padrão do método ToString retorna o nome completo do tipo do Object, como mostra o exemplo a seguir.

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object

esse comportamento é herdado por tipos de referência que não substituem o método ToString.

A conversão de tipos em C# funciona apenas nos moldes da herança de classe.Object é a raiz de todos os tipos em C# e, portanto, todos os valores podem ser convertidos para ele.

string e int não compartilham o mesmo ramo de herança e, portanto, não podem ser convertidos diretamente de um para outro.

Convert.ToString() é um método projetado para converter um número inteiro em uma string - não há conversão de tipo, apenas executa um método projetado para converter um número inteiro em uma representação de string.

i.ToString() executa a funcionalidade equivalente a Convert.ToString(), exceto aquilo i.ToString() possui sobrecargas que permitem maior flexibilidade na representação do número em formato string.

Uma última observação: exceções às regras de conversão de tipo podem ser incluídas pelo desenvolvedor usando um public static explicit operator método que permite ao desenvolvedor converter um valor em outro conforme achar adequado.

A primeira coisa a notar é que toda classe deriva de objeto.

A conversão de int para objeto está usando um Int32.

A conversão de string em objeto está usando uma String.

Não há conversão implícita de um número inteiro para uma string porque eles estão em partes diferentes da hierarquia de classes - um não se relaciona de forma alguma com o outro.No entanto, como string é usado com frequência para objetos de saída (e, portanto, todos os seus filhos), há um método ToString() por conveniência.

No entanto, Convert foi escrito especificamente para poder converter de um tipo para outro, por exemplo, Convert.ToBool(x) pode analisar "true" ou "false" em booleano e, como você mostrou, pode converter um número inteiro em uma string - novamente, isso é realmente uma conveniência que provavelmente apenas chama Int32.ToString() nos bastidores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top