Benutzerdefinierte Konvertierungsoperatoren (C#-Referenz)User-defined conversion operators (C# reference)

Ein benutzerdefinierter Typ kann eine benutzerdefinierte implizite oder explizite Konvertierung von einem oder in einen anderen Typ definieren.A user-defined type can define a custom implicit or explicit conversion from or to another type.

Zum Aufrufen von impliziten Konvertierungen ist keine spezielle Syntax erforderlich. Implizite Konvertierungen können in verschiedenen Situationen auftreten, beispielswiese in Arbeitsaufträgen und Methodenaufrufen.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. Vordefinierte implizite C#-Konvertierungen sind immer erfolgreich und lösen keine Ausnahmen aus.Predefined C# implicit conversions always succeed and never throw an exception. Benutzerdefinierte Konvertierungen sollten sich ebenso verhalten.User-defined implicit conversions should behave in that way as well. Wenn bei einer benutzerdefinierten Konvertierung eine Ausnahme ausgelöst werden kann oder Informationen verloren gehen können, definieren Sie sie als explizite Konvertierung.If a custom conversion can throw an exception or lose information, define it as an explicit conversion.

Benutzerdefinierte Konvertierungen werden vom is- und as-Operator nicht berücksichtigt.User-defined conversions are not considered by the is and as operators. Verwenden Sie einen Cast-Ausdruck, um eine benutzerdefinierte explizite Konvertierung aufzurufen.Use a cast expression to invoke a user-defined explicit conversion.

Verwenden Sie zum Definieren einer impliziten bzw. expliziten Konvertierung die Schlüsselwörter operator und implicit bzw. explicit.Use the operator and implicit or explicit keywords to define an implicit or explicit conversion, respectively. Bei dem Typ, der eine Konvertierung definiert, muss es sich um einen Quelltyp oder um einen Zieltyp dieser Konvertierung handeln.The type that defines a conversion must be either a source type or a target type of that conversion. Eine Konvertierung zwischen zwei benutzerdefinierten Typen kann in einem der beiden Typen definiert werden.A conversion between two user-defined types can be defined in either of the two types.

Im folgenden Beispiel wird gezeigt, wie eine implizite und eine explizite Konvertierung definiert wird: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
    }
}

Sie können auch das Schlüsselwort operator verwenden, um einen vordefinierten C#-Operator zu überladen.You also use the operator keyword to overload a predefined C# operator. Weitere Informationen finden Sie unter Operatorüberladung.For more information, see Operator overloading.

C#-SprachspezifikationC# language specification

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:For more information, see the following sections of the C# language specification:

Siehe auchSee also