Opérateurs de conversion explicites et implicites définis par l’utilisateur

Un type défini par l’utilisateur peut définir une conversion implicite ou explicite personnalisée depuis ou vers un autre type. Les conversions implicites ne nécessitent pas une syntaxe spéciale à appeler et peuvent se produire dans diverses situations, par exemple, dans les appels de méthodes et les affectations. Les conversions implicites C# prédéfinies réussissent toujours et ne lèvent jamais d’exception. Les conversions implicites définies par l’utilisateur doivent aussi se comporter de cette façon. Si une conversion personnalisée peut lever une exception ou perdre des informations, définissez-la comme conversion explicite.

Les conversions définies par l’utilisateur ne sont pas prises en compte par les opérateurs is et as. Utilisez l’expression de cast pour appeler une conversion explicite définie par l’utilisateur.

Utilisez les mots clés operator et implicit ou explicit pour définir une conversion implicite ou explicite, respectivement. Le type qui définit une conversion doit être un type source ou un type cible de cette conversion. Une conversion entre deux types définis par l’utilisateur peut être définie dans l’un ou l’autre des deux types.

L'exemple suivant montre comment définir une conversion implicite et explicite :

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

À compter de C# 11, vous pouvez définir des opérateurs de conversion explicite vérifiés. Pour plus d’informations, consultez la section Opérateurs vérifiés définis par l’utilisateur de l’article Opérateurs arithmétiques.

Utilisez également le mot clé operator pour surcharger un opérateur C# prédéfini. Pour plus d’informations, consultez Surcharge d’opérateur.

spécification du langage C#

Pour plus d’informations, consultez les sections suivantes de la spécification du langage C# :

Voir aussi