Looking for c# Keywords? Try Ask4Keywords

C# Language Перегружаемые операторы


пример

C # позволяет пользовательским типам перегружать операторы путем определения статических функций-членов с использованием ключевого слова operator .
Следующий пример иллюстрирует реализацию оператора + .

Если у нас есть класс Complex представляющий комплексное число:

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

И мы хотим добавить опцию для использования оператора + для этого класса. то есть:

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

Нам нужно будет перегрузить оператор + для класса. Это делается с использованием статической функции и ключевого слова operator :

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

Операторы, такие как + , - , * , / могут быть перегружены. Сюда также входят операторы, которые не возвращают один и тот же тип (например, == и != Могут быть перегружены, несмотря на возврат булевых элементов). Здесь также применяется правило, относящееся к парам.

Операторы сравнения должны быть перегружены парами (например, если < перегружен, > также необходимо перегрузить).

Полный список перегружаемых операторов (а также неперегружаемых операторов и ограничений, помещенных на некоторые перегружаемые операторы) можно увидеть в MSDN - Overloadable Operators (Руководство по программированию на C #) .

7,0

перегрузка operator is была введена с помощью механизма сопоставления шаблонов C # 7.0. Для получения дополнительной информации см Pattern Matching

Учитывая тип Cartesian определенный следующим образом

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

Перегружаемый operator is может быть определен, например, для 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;
    }
}

который можно использовать следующим образом

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

(Пример взята из сопоставимой документации по шаблону Roslyn )