Страницы

Поиск по вопросам

вторник, 5 февраля 2019 г.

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

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


Ответ

Давайте создадим тестовый класс и перегрузим оператор сложения для него:
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# не предусматривает приватные перегруженные операторы? По той же причине, по которой он не поддерживает методы с одинаковыми параметрами, но разными модификаторами доступа: компилятор не сможет понять, какую именно функцию Вы захотите использовать в некотором контексте.

Комментариев нет:

Отправить комментарий