explicit (Referencia de C#)explicit (C# Reference)

La palabra clave explicit declara un operador de conversión de tipo definido por el usuario que se debe invocar con una conversión.The explicit keyword declares a user-defined type conversion operator that must be invoked with a cast.

En el ejemplo siguiente se define el operador que convierte de una clase Fahrenheit a una clase Celsius.The following example defines the operator that converts from a Fahrenheit class to a Celsius class. El operador debe definirse en una clase Fahrenheit o en una clase Celsius:The operator must be defined either inside a Fahrenheit class or a Celsius class:

public static explicit operator Celsius(Fahrenheit fahr)
{
    return new Celsius((5.0f / 9.0f) * (fahr.Degrees - 32));
}

El operador de conversión definido se invoca con una conversión, como se muestra en el ejemplo siguiente:You invoke the defined conversion operator with a cast, as the following example shows:

Fahrenheit fahr = new Fahrenheit(100.0f);
Console.Write($"{fahr.Degrees} Fahrenheit");
Celsius c = (Celsius)fahr;

El operador de conversión convierte un tipo de origen en un tipo de destino.The conversion operator converts from a source type to a target type. El tipo de origen proporciona el operador de conversión.The source type provides the conversion operator. A diferencia de la conversión implícita, los operadores de conversión explícitos deben invocarse mediante una conversión.Unlike implicit conversion, explicit conversion operators must be invoked by means of a cast. Si una operación de conversión puede producir excepciones o pérdida de información, debe marcarse como explicit.If a conversion operation can cause exceptions or lose information, you should mark it explicit. Esto impide que el compilador invoque silenciosamente la operación de conversión con posibles consecuencias no deseadas.This prevents the compiler from silently invoking the conversion operation with possibly unforeseen consequences.

Omitir la conversión produce el error en tiempo de compilación CS0266.Omitting the cast results in compile-time error CS0266.

Para obtener más información, vea Uso de operadores de conversión.For more information, see Using Conversion Operators.

EjemploExample

En el ejemplo siguiente se proporciona una clase Fahrenheit y una clase Celsius, y cada una proporciona un operador de conversión explícita a la otra clase.The following example provides a Fahrenheit and a Celsius class, each of which provides an explicit conversion operator to the other class.

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

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

class MainClass
{
    static void Main()
    {
        Fahrenheit fahr = new Fahrenheit(100.0f);
        Console.Write($"{fahr.Degrees} Fahrenheit");
        Celsius c = (Celsius)fahr;

        Console.Write($" = {c.Degrees} Celsius");
        Fahrenheit fahr2 = (Fahrenheit)c;
        Console.WriteLine($" = {fahr2.Degrees} Fahrenheit");
    }
}
// Output:
// 100 Fahrenheit = 37.77778 Celsius = 100 Fahrenheit

EjemploExample

En el ejemplo siguiente se define una struct, Digit, que representa un único dígito decimal.The following example defines a struct, Digit, that represents a single decimal digit. Se define un operador para conversiones de byte a Digit, pero como no todos los bytes se pueden convertir a un Digit, la conversión es explícita.An operator is defined for conversions from byte to Digit, but because not all bytes can be converted to a Digit, the conversion is explicit.

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#C# language specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also