Partager via


explicit (Référence C#)

Le mot clé explicit déclare un opérateur de conversion de type défini par l'utilisateur qui doit être appelé avec un cast. Par exemple, cet opérateur convertit d'une classe appelée Fahrenheit en une classe appelée Celsius :

// Must be defined inside a class called Farenheit:
public static explicit operator Celsius(Farenheit f)
{
    return new Celsius((5.0f/9.0f)*(f.degrees-32));
}

Cet opérateur de conversion peut être appelé comme suit :

Farenheit f = new Farenheit(100.0f);
Celsius c = (Celsius)f;

Notes

L'opérateur de conversion convertit un type source en type cible. Le type source fournit l'opérateur de conversion. À la différence de la conversion implicite, les opérateurs de conversion explicite doivent être appelés au moyen d'une conversion. Si une opération de conversion risque de provoquer des exceptions ou de perdre des informations, vous devez la marquer comme explicit. Ceci empêche le compilateur d'appeler en mode silencieux l'opération de conversion, ce qui pourrait entraîner des conséquences imprévisibles.

L'omission d'une conversion entraîne une erreur de compilation Erreur du compilateur CS0266.

Pour plus d'informations, consultez Utilisation d'opérateurs de conversion (guide de programmation C#).

Exemple

L'exemple suivant fournit une classe Fahrenheit et une classe Celsius, chacune fournissant un opérateur de conversion explicite à l'autre classe.

// cs_keyword_explicit_temp.cs
using System;
class Celsius
{
    public Celsius(float temp)
    {
        degrees = temp;
    }
    public static explicit operator Fahrenheit(Celsius c)
    {
        return new Fahrenheit((9.0f / 5.0f) * c.degrees + 32);
    }
    public float Degrees
    {
        get { return degrees; }
    }
    private float degrees;
}

class Fahrenheit
{
    public Fahrenheit(float temp)
    {
        degrees = temp;
    }
    public static explicit operator Celsius(Fahrenheit f)
    {
        return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
    }
    public float Degrees
    {
        get { return degrees; }
    }
    private float degrees;
}

class MainClass
{
    static void Main()
    {
        Fahrenheit f = new Fahrenheit(100.0f);
        Console.Write("{0} fahrenheit", f.Degrees);
        Celsius c = (Celsius)f;
        Console.Write(" = {0} celsius", c.Degrees);
        Fahrenheit f2 = (Fahrenheit)c;
        Console.WriteLine(" = {0} fahrenheit", f2.Degrees);
    }
}

Sortie

 
100 fahrenheit = 37.77778 celsius = 100 fahrenheit

L'exemple ci-dessous définit un struct, Digit, qui représente un seul chiffre décimal. Un opérateur est défini pour des conversions de byte à Digit, et comme tous les octets ne peuvent pas être convertis en Digit, la conversion est explicite.

// cs_keyword_explicit_2.cs
using System;
struct Digit
{
    byte value;
    public Digit(byte value)
    {
        if (value > 9)
        {
            throw new ArgumentException();
        }
        this.value = value;
    }

    // Define explicit byte-to-Digit conversion operator:
    public static explicit operator Digit(byte b)
    {
        Digit d = new Digit(b);
        Console.WriteLine("conversion occurred");
        return d;
    }
}

class MainClass
{
    static void Main()
    {
        try
        {
            byte b = 3;
            Digit d = (Digit)b; // explicit conversion
        }
        catch (Exception e)
        {
            Console.WriteLine("{0} Exception caught.", e);
        }
    }
}

Sortie

 
conversion occurred

Spécification du langage C#

Pour plus d'informations, consultez les sections suivantes dans Spécifications du langage C#.

  • 6.2 Conversions explicites

Voir aussi

Tâches

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

Référence

Mots clés C#
implicit (Référence C#)
operator (Référence C#)

Concepts

Guide de programmation C#

Autres ressources

Référence C#