C# Language Operadores sobrecargables


Ejemplo

C # permite que los tipos definidos por el usuario sobrecarguen a los operadores definiendo funciones miembro estáticas usando la palabra clave del operator .
El siguiente ejemplo ilustra una implementación del operador + .

Si tenemos una clase Complex que representa un número complejo:

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

Y queremos agregar la opción de usar el operador + para esta clase. es decir:

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

Tendremos que sobrecargar el operador + para la clase. Esto se hace usando una función estática y la palabra clave del operator :

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

Los operadores como + , - , * , / pueden estar sobrecargados. Esto también incluye a los operadores que no devuelven el mismo tipo (por ejemplo, == y != Pueden estar sobrecargados, a pesar de los booleanos que regresan).

Los operadores de comparación deben estar sobrecargados en pares (por ejemplo, si < está sobrecargado, > también debe sobrecargarse).

Una lista completa de operadores sobrecargables (así como operadores no sobrecargables y las restricciones impuestas a algunos operadores sobrecargables) puede verse en MSDN - Operadores sobrecargables (Guía de programación de C #) .

7.0

la sobrecarga del operator is se introdujo con el mecanismo de coincidencia de patrones de C # 7.0. Para más detalles, ver el patrón de coincidencia

Dado un tipo Cartesian definido como sigue

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

Un operator is sobrecargable podría, por ejemplo, definirse para coordenadas 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;
    }
}

que puede ser usado como este

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

(El ejemplo está tomado de la documentación de Roslyn Pattern Matching )