Operadores de conversión definidos por el usuario (referencia de C#)User-defined conversion operators (C# reference)

Un tipo definido por el usuario puede definir una conversión implícita o explícita personalizada desde o a otro tipo.A user-defined type can define a custom implicit or explicit conversion from or to another type.

Las conversiones implícitas no requieren que se invoque una sintaxis especial y pueden producirse en diversas situaciones, por ejemplo, en las invocaciones de métodos y asignaciones.Implicit conversions don't require special syntax to be invoked and can occur in a variety of situations, for example, in assignments and methods invocations. Las conversiones implícitas predefinidas en C# siempre se realizan correctamente y nunca inician una excepción.Predefined C# implicit conversions always succeed and never throw an exception. Las conversiones implícitas definidas por el usuario deben comportarse de esta manera.User-defined implicit conversions should behave in that way as well. Si una conversión personalizada puede producir una excepción o perder información, se define como una conversión explícita.If a custom conversion can throw an exception or lose information, define it as an explicit conversion.

Los operadores is y as no tienen en cuenta las conversiones definidas por el usuario.User-defined conversions are not considered by the is and as operators. Use una expresión Cast para invocar una conversión explícita definida por el usuario.Use a cast expression to invoke a user-defined explicit conversion.

Use las palabras clave operator y implicit o explicit para definir una conversión implícita o explícita, respectivamente.Use the operator and implicit or explicit keywords to define an implicit or explicit conversion, respectively. El tipo que define una conversión debe ser un tipo de origen o un tipo de destino de dicha conversión.The type that defines a conversion must be either a source type or a target type of that conversion. Una conversión entre dos tipos definidos por el usuario se puede definir en cualquiera de los dos tipos.A conversion between two user-defined types can be defined in either of the two types.

En el ejemplo siguiente se muestra cómo se define una conversión implícita y explícita:The following example demonstrates how to define an implicit and explicit conversion:

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

Use también la palabra clave operator para sobrecargar un operador predefinido en C#.You also use the operator keyword to overload a predefined C# operator. Para obtener más información, vea Sobrecarga de operadores.For more information, see Operator overloading.

Especificación del lenguaje C#C# language specification

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:For more information, see the following sections of the C# language specification:

Vea tambiénSee also