Überladbare Operatoren (C#-Programmierhandbuch)

C# ermöglicht benutzerdefinierten Typen, mithilfe des Schlüsselworts operator Operatoren durch das Definieren von statischen Memberfunktionen zu überladen. Nicht alle Operatoren können überladen werden und weisen andere Einschränkungen auf. Eine entsprechende Auflistung finden Sie in dieser Tabelle:

Operatoren Überladbarkeit
+, -, !, ~, ++, --, true, false Diese unären Operatoren können überladen werden.
+, -, *, /, %, &, |, ^, <<, >> Diese binären Operatoren können überladen werden.
==, !=, <, >, <=, >= Die Vergleichsoperatoren können überladen (beachten Sie jeden Hinweis im Anschluss an diese Tabelle) werden.
&&, || Die bedingten logischen Operatoren können nicht überladen werden. Sie werden jedoch mithilfe von & und | ausgewertet, die überladen werden können.
[] Der Arrayindizierungsoperator kann nicht überladen werden. Sie können jedoch Indexer definieren.
(T)x Der Umwandlungsoperator kann nicht überladen werden. Sie können jedoch neue Konvertierungsoperatoren definieren (siehe explicit und implicit).
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= Zuweisungsoperatoren können nicht überladen werden. += wird jedoch beispielsweise mithilfe von + ausgewertet, was wiederum überladen werden kann.
=, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof Diese Operatoren können nicht überladen werden.
Hinweis

Die Vergleichsoperatoren müssen, sofern sie überladen sind, paarweise überladen werden. Beim Überladen von == muss != demnach ebenfalls überladen werden. Das Gegenteil trifft ebenfalls zu, wenn das Überladen von != eine Überladung von == erfordert. Das gleiche gilt für die Vergleichsoperatoren <, >, <= und >=.

Für das Überladen eines Operators in einer benutzerdefinierten Klasse muss eine Methode in der Klasse mit der richtigen Signatur erstellt werden. Die Methode muss als „operator X“ bezeichnet werden, wobei X für den Namen oder das Symbol des zu überladenden Operators steht. Unäre Operatoren verfügen über einen Parameter. Demgegenüber weisen binäre Operatoren zwei Parameter auf. In jedem Fall muss ein Parameter denselben Typ wie die Klasse oder Struktur aufweisen, die den Operator deklariert.

public static Complex operator +(Complex c1, Complex c2)
{
    return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
}

Es ist üblich, Definitionen zu verwenden, die umgehend das Ergebnis des Ausdrucks zurückgeben. Es gibt eine Syntaxabkürzung mithilfe von => für diese Situationen

public static Complex operator +(Complex c1, Complex c2) =>
        new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);

// Override ToString() to display a complex number in the traditional format:
public override string ToString() => $"{this.real} + {this.imaginary}";

Weitere Informationen finden Sie unter Vorgehensweise: Verwenden der Operatorüberladung zum Erstellen einer Klasse für komplexe Zahlen.

Siehe auch

C#-Programmierhandbuch
Anweisungen, Ausdrücke und Operatoren
Operatoren
C#-Operatoren
Why are overloaded operators always static in C#? (Warum sind überladene Operatoren in C# immer statisch?)