C# - Conversão entre tipos : implícita e explícita - II


Hoje vamos continuar abordando o conceito de conversão implícita e explícita na linguagem C#.

Continuando a primeira parte do artigo, temos que na linguagem C #, ao realizar uma conversão entre tipos , se os tipos de dados são compatíveis, então o C# realiza a conversão automática caso contrário é necessário realizar uma conversão explicíta.

Assim a conversão implicita acontece quando :

1- Os dois tipos de dados são compatíveis.
2- Quando atribuímos o valor de um tipo de dados menor a um tipo de dados maior.

Por exemplo, os tipos de dados numéricos são compatíveis entre si, mas nenhuma conversão automática é suportada pelo tipo numérico para char ou booleano. Eles não são compatíveis entre si. Antes da conversão, o compilador verifica primeiro a compatibilidade conforme a figura abaixo e então decide se a conversão é possível ou lançara um erro.

Converte  do Tipos de dados Para o Tipo de dados
byte short, int, long, float, double
short int, long, float, double
int long, float, double
long float, double
float double

Quando os tipos não são compatíveis vai ocorrer um erro de compilação. Por exemplo , double é incompatível com int.

Exemplo:

 public static void Main(String []args) 
 { 
    double d = 765.12;   
    // Tipo de dados incompatível
    int i = d;               
     // resultado
     Console.WriteLine("Valor de i é ", +i ); 
} 

Aqui teremos novamente o erro: "Cannot implicitly convert type 'long' to 'int'. An explicit conversion exists(are you missing a cast?)"

Portanto, se queremos atribuir um valor de tipo de dados maior a um tipo de dados menor, devemos executar a conversão explícita de tipos.

Isso é útil para tipos de dados incompatíveis em que a conversão automática não pode ser feita. Aqui, o tipo de destino especifica o tipo desejado para o qual converter o valor especificado, e pode, às vezes, resultar na conversão com perdas.

Exemplo:

 public static void Main(String []args) 
 { 
    double d = 765.12;   
    // Tipo de dados incompatível
    int i = (int)d;               
     // resultado
     Console.WriteLine("Valor de i é ", +i ); 
} 

O resultado obtido será 765 ocorrendo assim perda de 0.12.

Outros métodos para realizar a conversão entre tipos

A linguagem C# oferece métodos prontos para realizar a conversão entre tipos. A seguir temos uma tabela exibindo os principais:

Método Descrição
ToBoolean Converte para um valor Boolean
ToChar Converte para um  character
ToByte Converte para Byte
ToDecimal Converte o valor para Decimal
ToDouble Converte para double
ToInt16 Converte para int de 16-bit
ToInt32 Converte para int de 32 bit
ToInt64 Converte para int  de 64 bit
ToString Converte para string
ToUInt16 Converte para um int unsigned de 16 bit
ToUInt32 Converte para um int unsigned de 32 bit
ToUInt64 Converte para um int unsigned de 64 bit

Exemplo de utilização:

  public static void Main(String []args) 
   { 
        int i = 12; 
        double d = 765.12; 
        float f = 56.123F;               
        Console.WriteLine(Convert.ToString(f)); 
        Console.WriteLine(Convert.ToInt32(d)); 
        Console.WriteLine(Convert.ToUInt32(f)); 
        Console.WriteLine(Convert.ToDouble(i)); 

        Console.ReadKey();
  } 

Além desses métodos cada tipo possui o Parse que permite converter strings para o tipo especificado:

Na verdade ao usar o Convert ele chama o método Parse, mas possui a vantagem de verificar se o tipo não é um null, coisa que o Parse, que embora seja mais rápido, não faz.

Assim para converter uma string para um número podemos usar o Convert, o Parse e também o TryParse.

Os métodos Parse e TryParse ignoram o espaço em branco no início e no final da string; porém, todos os outros caracteres devem formar o tipo numérico correto (int, long, ulong, float, decimal etc.).

Qualquer espaço em branco na cadeia de caracteres que forma o número causará um erro.

Por exemplo, é possível usar decimal.TryParse para analisar "10", "10,3" ou " 10 ", mas não é possível usar esse método para analisar 10 de "10X", "1 0" (observe o espaço inserido), "10 .3" (observe o espaço inserido), já o valor "10e1", usando float.TryParse funcionará, e assim por diante.

Além disso, uma cadeia de caracteres cujo valor seja null ou String.Empty falhará ao ser analisada com êxito. Você pode verificar uma string nula ou vazia antes de tentar analisá-la chamando o método String.IsNullOrEmpty.

Para detalhes veja o meu artigo : C# - Diferença entre int.Parse() e int.TryParse() - Macoratti

E estamos conversados.

"Para que os seus corações sejam consolados, e estejam unidos em amor, e enriquecidos da plenitude da inteligência, para conhecimento do mistério de Deus e Pai, e de Cristo, Em quem estão escondidos todos os tesouros da sabedoria e da ciência."
Colossenses 2:2,3

Referências:


José Carlos Macoratti