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.

Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.

La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.

Suggerimento

Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.

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. È 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
    }
}

È 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