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 ou para outro tipo. As conversões implícitas não exigem sintaxe especial para serem invocadas e podem ocorrer em várias situações, por exemplo, em atribuições e invocações de métodos. Conversões implícitas em C# predefinidas 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.
As conversões definidas pelo usuário não são consideradas pelo is e como operadores. Use uma expressão de conversão para invocar uma conversão explícita definida pelo usuário.
Use as operator
palavras-chave e ou implicit
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 um tipo de destino dessa conversão. Uma conversão entre 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 . Para obter mais informações, consulte a seção Operadores verificados definidos pelo usuário do artigo Operadores aritméticos.
Você também usa a operator
palavra-chave para sobrecarregar um operador C# predefinido. Para obter mais informações, consulte Sobrecarga do operador.
Especificação da linguagem C#
Para obter mais informações, consulte 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