C# Language Operatori sovraccarichi


Esempio

C # consente ai tipi definiti dall'utente di sovraccaricare gli operatori definendo funzioni membro statiche utilizzando la parola chiave operator .
L'esempio seguente illustra un'implementazione dell'operatore + .

Se abbiamo una classe Complex che rappresenta un numero complesso:

public struct Complex
{
    public double Real { get; set; }
    public double Imaginary { get; set; }
}

E vogliamo aggiungere l'opzione per usare l'operatore + per questa classe. vale a dire:

Complex a = new Complex() { Real = 1, Imaginary = 2 };
Complex b = new Complex() { Real = 4, Imaginary = 8 };
Complex c = a + b;

Dovremo sovraccaricare l'operatore + per la classe. Questo viene fatto usando una funzione statica e la parola chiave operator :

public static Complex operator +(Complex c1, Complex c2)
{
   return new Complex 
   { 
       Real = c1.Real + c2.Real,
       Imaginary = c1.Imaginary + c2.Imaginary 
   };
}

Operatori come + , - , * , / possono essere sovraccaricati. Ciò include anche operatori che non restituiscono lo stesso tipo (ad esempio, == e != Possono essere sovraccaricati, nonostante il ritorno di booleani) Viene applicata anche la regola seguente relativa alle coppie.

Gli operatori di confronto devono essere sovraccaricati a coppie (ad esempio, se < è sovraccarico, > deve essere sovraccaricato).

Un elenco completo degli operatori sovraccaricabili (così come degli operatori non sovraccaricabili e delle restrizioni imposte ad alcuni operatori sovraccaricabili) può essere visto su MSDN - Operatori sovraccaricabili (C # Programming Guide) .

7.0

l'overloading operator is stato introdotto con il meccanismo di corrispondenza del modello di C # 7.0. Per i dettagli vedi Pattern Matching

Dato un tipo di Cartesian definito come segue

public class Cartesian
{
    public int X { get; }
    public int Y { get; }
}   

Un operator is sovraccarico può essere definito ad esempio per coordinate Polar

public static class Polar
{
    public static bool operator is(Cartesian c, out double R, out double Theta)
    {
        R = Math.Sqrt(c.X*c.X + c.Y*c.Y);
        Theta = Math.Atan2(c.Y, c.X);
        return c.X != 0 || c.Y != 0;
    }
}

che può essere usato in questo modo

var c = Cartesian(3, 4);
if (c is Polar(var R, *))
{
    Console.WriteLine(R);
}

(L'esempio è tratto dalla documentazione di corrispondenza del modello Roslyn )