C# - Criando um operador de conversão
Hoje veremos como definir um operador de conversão para converter de um tipo para outro na linguagem C#.

A linguagem  C#  é estaticamente tipada em tempo de compilação, e após uma variável ser declarada, ela 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.

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.

Suponha que você deseja criar um operador para realizar conversões de/para um tipo que você criou.

Você pode especificar como seu tipo é convertido em outros tipos e, igualmente, como outros tipos são convertidos em seu tipo, declarando operadores de conversão em sua classe.

Um operador de conversão é um método estático que é nomeado para o tipo que você deseja converter e que tem o tipo que você deseja converter.

No código abaixo temos um método onde um operador de conversão do tipo Palavra (que veremos a seguir) que converte uma instância de uma string em uma instância do tipo Palavra:

public static explicit operator Palavra(string str)
{
     return new Palavra() { Text = str };
}

A definição desse membro na classe Palavra permite realizar conversões como as seguintes:

Palavra palavra = (Palavra)"Olá";

Observe que tivemos que converter explicitamente a string para Palavra - isso ocorre porque nosso operador de conversão incluiu a palavra-chave explicit.

Você pode ativar a conversão implícita usando a palavra-chave implicit, assim:

public static implicit operator Palavra(string str)
{
     return new Palavra() { Text = str };
}

Agora, com a palavra-chave implicit, as duas instruções a seguir seriam compiladas:

Palavra palavra = (Palavra) "Olá";
Palavra palavra = "Olá";


Lembrando que os operadores de conversão devem sempre ser estáticos e você deve escolher entre uma conversão explicita ou implícita;  você não pode definir operadores de conversão diferentes para o mesmo par de tipos e
com palavras-chave diferentes.

A seguir vamos criar um projeto C# do tipo Console na plataforma .NET Core e mostrar isso na prática.

recursos usados:

  • Visual Basic 2019 Community Edition

Criando o projeto C# no VS 2019

Crie um projeto Console do tipo .NET Core chamado Cshp_OperadorConversao1;

Crie a classe Palavra no arquivo Palavra.cs no projeto com o código abaixo:

Agora vamos testar as conversões incluindo o código a seguir no método Main da classe Program:

Executando o projeto teremos:

Concluindo...

Vimos assim a utilização do operador de conversão implicit e explicit para o tipo Palavra, ou seja, um tipo definido pelo usuário pode definir uma conversão implícita ou explícita personalizada de ou para outro tipo.

As conversões implícitas não exigem que uma sintaxe especial seja invocada e podem ocorrer em várias situações, por exemplo, em designações e invocações de métodos.

As conversões implícitas pré-definidas na linguagem C# sempre são bem-sucedidas e nunca lançam uma exceção.

As conversões implícitas definidas pelo usuário também devem se comportar dessa maneira. Se uma conversão personalizada puder gerar uma exceção ou perder informações, defina-a como uma conversão explícita.

Conversões definidas pelo usuário não são consideradas pelos operadores is e as. Use o operador de conversão () para chamar uma conversão explícita definida pelo usuário.

Pegue o código do projeto aqui:  CShp_OperadorConversao1.zip

"Quem tem o Filho tem a vida; quem não tem o Filho de Deus não tem a vida."
1 João 5:12

Referências:


José Carlos Macoratti