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#:
- Operatori di conversione
- Conversioni definite dall'utente
- Conversioni implicite
- Conversioni esplicite