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