Operatory konwersji zdefiniowane przez użytkownika (C# odwołanie)User-defined conversion operators (C# reference)

Typ zdefiniowany przez użytkownika może definiować niestandardową lub niejawną konwersję z lub do innego typu.A user-defined type can define a custom implicit or explicit conversion from or to another type.

Konwersje niejawne nie wymagają wywoływania specjalnej składni i mogą wystąpić w różnych sytuacjach, na przykład w przypisaniach i metodach wywołania.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. Wstępnie C# zdefiniowane konwersje niejawne zawsze kończą się powodzeniem i nigdy nie generują wyjątku ani nie tracą informacji.Predefined C# implicit conversions always succeed and never throw an exception or lose information. Niejawne konwersje zdefiniowane przez użytkownika powinny również działać w ten sposób.User-defined implicit conversions should behave in that way as well. Jeśli niestandardowa konwersja może zgłosić wyjątek lub utracić informacje, zdefiniuj ją jako konwersję jawną.If a custom conversion can throw an exception or lose information, define it as an explicit conversion.

Konwersje zdefiniowane przez użytkownika nie są uwzględniane przez operatory is i as .User-defined conversions are not considered by the is and as operators. Użyj operatora CAST () do wywołania jawnej konwersji zdefiniowanej przez użytkownika.Use the cast operator () to invoke a user-defined explicit conversion.

Użyj słów kluczowych implicit explicit i lub, aby zdefiniować odpowiednio niejawną lub jawną konwersję. operatorUse the operator and implicit or explicit keywords to define an implicit or explicit conversion, respectively. Typ, który definiuje konwersję, musi być typem źródłowym lub typem docelowym tej konwersji.The type that defines a conversion must be either a source type or a target type of that conversion. Konwersję między dwoma typami zdefiniowanymi przez użytkownika można zdefiniować w jeden z dwóch typów.A conversion between two user-defined types can be defined in either of the two types.

Poniższy przykład ilustruje sposób definiowania konwersji niejawnej i jawnej: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
    }
}

Możesz również użyć operator słowa kluczowego do przeciążenia wstępnie C# zdefiniowanego operatora.You also use the operator keyword to overload a predefined C# operator. Aby uzyskać więcej informacji, zobacz przeciążanie operatora.For more information, see Operator overloading.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz następujące sekcje C# specyfikacji języka:For more information, see the following sections of the C# language specification:

Zobacz takżeSee also