Share via


explicit (Referencia de C#)

La palabra clave explicit declara un operador de conversión de tipos definido por el usuario que se debe invocar con una conversión de tipos. Por ejemplo, este operador convierte una clase denominada Fahrenheit en una clase denominada Celsius:

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

El operador de conversión se puede invocar así:

Fahrenheit f = new Fahrenheit(100.0f);
Console.Write("{0} fahrenheit", f.Degrees);
Celsius c = (Celsius)f;

El operador de conversión convierte un tipo de origen en un tipo de destino. El tipo de origen proporciona el operador de conversión. A diferencia de la conversión implícita, los operadores de conversión explícita deben invocarse mediante una conversión de tipo (cast). Si una operación de conversión puede producir excepciones o pérdida de información, debe marcarse como explicit. De esta forma, se evita que el compilador realice la conversión automáticamente y se produzcan posibles consecuencias no deseadas.

Omitir los resultados de conversión del error en tiempo de compilación CS0266.

Para obtener más información, vea Utilizar operadores de conversión (Guía de programación de C#).

Ejemplo

El ejemplo siguiente proporciona una clase Fahrenheit y una clase Celsius, cada una de las cuales proporciona un operador de conversión explícito a la otra clase.


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;
    }
    // Must be defined inside a class called Farenheit:
    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);
    }
}
/*
Output:
100 fahrenheit = 37.77778 celsius = 100 fahrenheit
*/

El siguiente ejemplo define un struct, Digit, que representa un único dígito decimal. Se define un operador para conversiones de byte a Digit, pero como no todos los bytes se pueden convertir en Digit, la conversión es explícita.

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 ExplicitTest
{
    static void Main()
    {
        try
        {
            byte b = 3;
            Digit d = (Digit)b; // explicit conversion
        }
        catch (Exception e)
        {
            Console.WriteLine("{0} Exception caught.", e);
        }
    }
}
/*
Output:
conversion occurred
*/

Especificación del lenguaje C#

Para obtener más información, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Tareas

Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)

Referencia

Palabras clave de C#

implicit (Referencia de C#)

operator (Referencia de C#)

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#

Chained user-defined explicit conversions in C#