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


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

Na linguagem C #, existe um conceito chamado Conversões de tipo, que converte um tipo em outro.

Como a linguagem  C#  é estaticamente tipada em tempo de compilação, após uma variável ser declarada, ele não pode ser declarada novamente ou usada para armazenar valores de outro tipo, a menos que esse tipo seja convertível para o tipo da variável.

No entanto, às vezes você pode precisar copiar um valor em uma variável ou parâmetro de método de outro tipo; ou pode precisar atribuir uma variável de classe a uma variável de um tipo de interface.

Esses tipos de operações são chamados conversões de tipo. Dentro os tipos de conversões tempos as conversões explicitas e sa implícitas.

Assim existem dois tipos de conversões :

1. Conversão implícita
2. Conversão explícita


1- Conversão implícita

A conversão entre tipos que pode ser realizada automaticamente é conhecida como Implícita :

Ex:
        byte valor1 = 10;
        byte valor2 = 23;
        long total = valor1 + valor2;


Aqui neste exemplo, não precisamos especificar o tipo de dados para o tipo de destino; internamente, ele converterá o que está implícito. valor1 e valor2 são do tipo byte ao adicionar, atribuímos o valor a uma variável total que é um tipo de dados long.

Internamente, ele converte o valor do resultado em um tipo de dados long.

2- Conversão explícita

A conversão entre tipos que pode ser feita manualmente, em vez de automaticamente :

Ex:        
        long valor = 3000;
        int a = (int) valor ;   /* conversão válida. Valor máximo é 2147483647 */


Neste exemplo acima, podemos ver que valor é um tipo de dados long, para converter para o tipo int temos que atribuir explicitamente o int indicando para qual tipo de dados temos que converter.

Se não informarmos explicitamente o tipo int o compilador vai emitir um aviso:

 "Cannot implicitly convert type 'long' to 'int'. An explicit conversion exists(are you missing a cast?)"



A palavra-chave implicit é usada para declarar um operador de conversão implícita de tipo definido pelo usuário. Use-a para habilitar conversões implícitas entre um tipo definido pelo usuário e outro tipo, se houver garantia de que a conversão não causará perda de dados.

A palavra-chave explicit declara um operador de conversão de tipo definido pelo usuário que deve ser invocado com uma conversão. Ela é usada na sobrecarga de operador.

Vamos ver na prática como funciona essa conversão implícita e explícita em um exemplo mais consistente.

recursos usados:

Criando o projeto no VS 2019 Community

Vamos criar um projeto usando a linguagem C# do tipo Console App para .NET Framework. Podemos chamar o projeto de CShp_Conversor

Exemplo de uso de explicit :

using System;
namespace CSharp_RecursosRaros
{
    class Apartmento
    {
        public string Nome { get; set; }
        public static explicit operator Casa(Apartmento a)
        {
            return new Casa() { Nome = a.Nome };
        }
    }
    class Casa
    {
        public string Nome { get; set; }
        public static explicit operator Apartmento(Casa c)
        {
            return new Apartmento() { Nome = c.Nome };
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Casa casa = new Casa();
            casa.Nome = "Minha Casa";
            // Converte uma Casa para um Apartamento
            Apartmento apartamento = (Apartmento)casa;
            // Apartamento foi convertido de Casa
            Console.WriteLine(apartamento.Nome);
        }     
    }
}
Neste exemplo temos duas classes:

1 - Apartamento
2 - Casa

Cada uma fornece um operador público explicit

Esses operadores explícitos são implementados através da construção de uma nova instância do tipo de destino.

Eles definem a propriedade Nome.

Assim, o Apartamento ou Casa é agora do tipo oposto, mas tem o mesmo campo de dados.

Quando você usa um cast como (Apartamento) ou (Casa), este é um cast explícito.

Um cast implícito não usa essa sintaxe.

Exemplo de operador implicit :

namespace CSharp_RecursosRaros
{
    struct Digito
    {
        byte valor;
        public Digito(byte valor)  
        {
            if (valor > 9)
            {
                throw new System.ArgumentException();
            }
            this.valor = valor;
        }
        //operador de conversão implicita de Digito para byte
        public static implicit operator byte(Digito d)  
        {
            System.Console.WriteLine("Conversão realizada");
            return d.valor;  // conversão implicita
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Digito d = new Digito(3);
            byte b = d;  // conversão implicita -- não precisa fazer o cast
        }
    }
}

 

Este exemplo demonstra um operador de conversão implícita definindo um operador de conversão que converte de uma classe de valor chamada Digito no tipo Byte.

Como qualquer dígito pode ser convertido em um Byte, não há necessidade de forçar os usuários a serem explícitos com relação à conversão.

Assim é possível usar o operador de conversão implicit, ou o operador explicit, que é indicado para alguém que lê o código que está convertendo em um tipo.

Você só deve usar o operador implicit se estiver desenvolvendo um tipo comumente usado. Provavelmente é mais útil para o próprio .NET Framework.

Portanto: o operador implicit não é algo que a maioria dos programas exige. Vale a pena saber que existe, mas nem sempre é útil.

Concluindo, assim como implicit, a palavra-chave explicit pode ser usada para implementar conversões. Você deve ter cuidado ao implementar conversões para que sejam reversíveis e façam sentido.

Na proxima parte do artigo veremos outras formas de conversão entre tipos.

"Porque Deus não nos destinou para a ira, mas para a aquisição da salvação, por nosso Senhor Jesus Cristo,
Que morreu por nós, para que, quer vigiemos, quer durmamos, vivamos juntamente com ele."

1 Tessalonicenses 5:9,10

     DVDs com programas para estudo e Cursos de VB .NET e C#

       Visite a loja on-line para ver todos os cursos :  Loja do Macoratti.net
 

Referências:


José Carlos Macoratti