Benutzerdefinierte explizite und implizite Konvertierungsoperatoren

Ein benutzerdefinierter Typ kann eine benutzerdefinierte implizite oder explizite Konvertierung von einem oder in einen anderen Typ definieren. Zum Aufrufen impliziter Konvertierungen ist keine spezielle Syntax erforderlich. Implizite Konvertierungen können in verschiedenen Situationen auftreten, beispielswiese in Zuweisungen und Methodenaufrufen. Vordefinierte implizite C#-Konvertierungen sind immer erfolgreich und lösen keine Ausnahmen aus. Benutzerdefinierte Konvertierungen sollten sich ebenso verhalten. Wenn bei einer benutzerdefinierten Konvertierung eine Ausnahme ausgelöst werden kann oder Informationen verloren gehen können, definieren Sie sie als explizite Konvertierung.

Benutzerdefinierte Konvertierungen werden vom is- und vom as-Operator nicht berücksichtigt. Verwenden Sie einen Cast-Ausdruck, um eine benutzerdefinierte explizite Konvertierung aufzurufen.

Verwenden Sie zum Definieren einer impliziten bzw. expliziten Konvertierung die Schlüsselwörter operator und implicit bzw. explicit. Bei dem Typ, der eine Konvertierung definiert, muss es sich um einen Quelltyp oder um einen Zieltyp dieser Konvertierung handeln. Eine Konvertierung zwischen zwei benutzerdefinierten Typen kann in einem der beiden Typen definiert werden.

Im folgenden Beispiel wird gezeigt, wie eine implizite und eine explizite Konvertierung definiert wird:

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

Ab C# 11 können Sie überprüfte explizite Konvertierungsoperatoren definieren. Weitere Informationen finden Sie im Abschnitt Benutzerdefinierte checked-Operatoren des Artikels Arithmetische Operatoren.

Sie können auch das Schlüsselwort operator verwenden, um einen vordefinierten C#-Operator zu überladen. Weitere Informationen finden Sie unter Operatorüberladung.

C#-Sprachspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:

Weitere Informationen