Condividi tramite


Operatori di conversione espliciti e impliciti definiti dall'utente

Un tipo definito dall'utente può definire una conversione implicita o esplicita personalizzata da o a un altro tipo, purché non esista una conversione standard tra gli stessi due tipi. Le conversioni implicite non richiedono una sintassi speciale da richiamare e possono verificarsi in varie situazioni, ad esempio nelle assegnazioni e nelle chiamate ai metodi. Le conversioni implicite C# predefinite hanno sempre esito positivo e non generano mai un'eccezione. Anche le conversioni implicite definite dall'utente devono comportarsi in questo modo. Se una conversione personalizzata può generare un'eccezione o perdere informazioni, definirla come conversione esplicita.

Gli operatori is e come non considerano le conversioni definite dall'utente. Usare un'espressione cast per richiamare una conversione esplicita definita dall'utente.

Usare le operator parole chiave e o implicitexplicit 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 di tale conversione. Una conversione tra due tipi definiti dall'utente può essere definita 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.

Si usa anche la parola chiave per eseguire l'overload operator di un operatore C# predefinito. Per ulteriori informazioni, vedere Sovraccarico degli operatori.

Specificazione del linguaggio C#

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

Vedere anche