Operadores de conversão explícitos e implícitos definidos pelo usuário
Um tipo definido pelo usuário pode definir uma conversão implícita ou explícita personalizada de outro tipo ou para outro. Conversões implícitas não requerem que uma sintaxe especial seja invocada e podem ocorrer em uma variedade de situações, por exemplo, em atribuições e invocações de método. Conversões implícitas em C# predefinidas sempre têm êxito e nunca geram uma exceção. Conversões implícitas definidas pelo usuário devem se comportam dessa forma também. 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 uma expressão de conversão para invocar uma conversão explícita definida pelo usuário.
Use operator
e as palavras-chave implicit
ou explicit
para definir uma conversão implícita ou explícita, respectivamente. O tipo que define uma conversão deve ser um tipo de origem ou e destino dessa conversão. Uma conversão entre os dois tipos definidos pelo usuário pode ser definida em qualquer um dos dois tipos.
O exemplo a seguir demonstra como definir uma conversão implícita e explícita:
using System;
public readonly struct Digit
{
private readonly byte digit;
public Digit(byte digit)
{
if (digit > 9)
{
throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");
}
this.digit = digit;
}
public static implicit operator byte(Digit d) => d.digit;
public static explicit operator Digit(byte b) => new Digit(b);
public override string ToString() => $"{digit}";
}
public static class UserDefinedConversions
{
public static void Main()
{
var d = new Digit(7);
byte number = d;
Console.WriteLine(number); // output: 7
Digit digit = (Digit)number;
Console.WriteLine(digit); // output: 7
}
}
A partir do C# 11, você pode definir operadores de conversão explícita verificados. Saiba mais na seção Operadores verificados definidos pelo usuário do artigo Operadores aritméticos.
Use também a palavra-chave operator
para sobrecarregar um operador C# predefinido. Para obter mais informações, consulte Sobrecarga de operador.
Especificação da linguagem C#
Para obter mais informações, confira as seguintes seções da especificação da linguagem C#:
- Operadores de conversão
- Conversões Definidas pelo Usuário
- Conversões implícitas
- Conversões explícitas