Partager via


Comment : implémenter des conversions définies par l'utilisateur entre des structs (Guide de programmation C#)

L'exemple suivant définit deux structures, RomanNumeral et BinaryNumeral, et décrit les conversions entre ces deux structures.

Exemple

struct RomanNumeral
{
    private int value;

    public RomanNumeral(int value)  //constructor
    {
        this.value = value;
    }

    static public implicit operator RomanNumeral(int value)
    {
        return new RomanNumeral(value);
    }

    static public implicit operator RomanNumeral(BinaryNumeral binary)
    {
        return new RomanNumeral((int)binary);
    }

    static public explicit operator int(RomanNumeral roman)
    {
        return roman.value;
    }

    static public implicit operator string(RomanNumeral roman)
    {
        return ("Conversion to string is not implemented");
    }
}

struct BinaryNumeral
{
    private int value;

    public BinaryNumeral(int value)  //constructor
    {
        this.value = value;
    }

    static public implicit operator BinaryNumeral(int value)
    {
        return new BinaryNumeral(value);
    }

    static public explicit operator int(BinaryNumeral binary)
    {
        return (binary.value);
    }

    static public implicit operator string(BinaryNumeral binary)
    {
        return ("Conversion to string is not implemented");
    }
}

class TestConversions
{
    static void Main()
    {
        RomanNumeral roman;
        BinaryNumeral binary;

        roman = 10;

        // Perform a conversion from a RomanNumeral to a BinaryNumeral:
        binary = (BinaryNumeral)(int)roman;

        // Perform a conversion from a BinaryNumeral to a RomanNumeral:
        // No cast is required:
        roman = binary;

        System.Console.WriteLine((int)binary);
        System.Console.WriteLine(binary);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    10
    Conversion not yet implemented
*/

Programmation fiable

  • Dans l'exemple précédent, l'instruction :

    binary = (BinaryNumeral)(int)roman;
    

    convertit un RomanNumeral en BinaryNumeral. Étant donné qu'il n'existe pas de conversion directe de RomanNumeral vers BinaryNumeral, un cast est utilisé pour convertir un RomanNumeral en un int et un autre cast pour convertir ce dernier en un BinaryNumeral.

  • L'instruction

    roman = binary;
    

    convertit un BinaryNumeral en RomanNumeral. Étant donné que RomanNumeral définit une conversion implicite d'un BinaryNumeral, aucun cast n'est requis.

Voir aussi

Référence

Opérateurs de conversion (Guide de programmation C#)

Concepts

Guide de programmation C#

Autres ressources

Référence C#