Синтаксис перегрузки операторов C#

190
04 июля 2018, 04:10

Подскажите, пожалуйста, почему метод перегружающий оператор должен быть обязательно public и static?

Answer 1

Давайте создадим тестовый класс и перегрузим оператор сложения для него:

public class MyClass
{
    public int A { get; set; }
    public static MyClass operator +(MyClass A, MyClass B)
    {
        return new MyClass { A = A.A + B.A };
    }
}

А теперь посмотрим, какие методы декларирует наш класс:

MethodInfo[] methods = typeof(MyClass).GetMethods();

Среди прочего в массиве methods мы увидим такую запись:

MyClass op_Addition(MyClass, MyClass)

Условно, когда вы перегружаете оператор, создается метод с указанным названием и атрибутами Public | Static | HideBySig | SpecialName. Так что следующий код:

MyClass a = new MyClass { A = 1 };
MyClass b = new MyClass { A = 2 };
MyClass c = a + b;

На деле преобразуется в:

MyClass a = new MyClass { A = 1 };
MyClass b = new MyClass { A = 2 };
MyClass c = MyClass.op_Addition(a, b);

Как видите, когда Вы описали оператор, Вы создали статическую функцию с именем op_Addition. Статическая она по той причине, что в C# не предусмотрен вариант типа

public MyClass operator +(MyClass B)
{
    return new MyClass { A = this.A + B.A };
}

Да и это не нужно, так как статическим вариантом можно покрыть любую свою нужду. Так что плодить какие-то дополнительные методы с теми же возможностями - бессмыленно.

Почему синтаксис C# не предусматривает приватные перегруженные операторы? По той же причине, по которой он не поддерживает методы с одинаковыми параметрами, но разными модификаторами доступа: компилятор не сможет понять, какую именно функцию Вы захотите использовать в некотором контексте.

READ ALSO
Отправка данных из dataGridView в Form2

Отправка данных из dataGridView в Form2

Есть код для отправки данных из dataGridView в Form2:

202
Что лучше использовать и как обойти ограничения

Что лучше использовать и как обойти ограничения

Есть Веб приложение (ASP NET MVC), которое досталось на поддержкуЧасть по аутентификации использует подключение к базе MS SQL Server Expres

210