Operatori di conversione esplicita e implicita definiti dall'utente

Un tipo definito dall'utente può definire una conversione implicita o esplicita da o in un altro tipo. Le conversioni implicite non richiedono una sintassi specifica per essere richiamate e possono essere usate in diverse situazioni, ad esempio durante le chiamate di metodi e assegnazioni. Le conversioni implicite C# predefinite hanno sempre esito positivo e non generano mai un'eccezione. Anche le conversioni implicite definite dall'utente si devono comportare nello stesso modo. Se una conversione personalizzata può generare un'eccezione o una perdita di informazioni, è necessario definirla come conversione esplicita.

Le conversioni definite dall'utente non vengono considerate dagli operatori is e as. Usare un'espressione cast per richiamare una conversione esplicita definita dall'utente.

Usare operator e implicit o le parole chiave explicit per definire rispettivamente una conversione implicita o esplicita. Il tipo che definisce una conversione deve essere un tipo di origine o un tipo di destinazione della conversione. È possibile definire una conversione tra due tipi definiti dall'utente in uno dei due tipi.

L'esempio seguente illustra come definire una conversione implicita ed esplicita:

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 partire da C# 11, è possibile definire operatori di conversione espliciti controllati. Per altre informazioni, vedere la sezione Operatori controllati definiti dall'utente dell'articolo Operatori aritmetici.

È anche possibile usare la parola chiave operator per eseguire l'overload di un operatore C# predefinito. Per altre informazioni, vedere Overload degli operatori.

Specifiche del linguaggio C#

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:

Vedi anche