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