Подскажите, пожалуйста, почему метод перегружающий оператор должен быть обязательно 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#
не предусматривает приватные перегруженные операторы? По той же причине, по которой он не поддерживает методы с одинаковыми параметрами, но разными модификаторами доступа: компилятор не сможет понять, какую именно функцию Вы захотите использовать в некотором контексте.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Есть Веб приложение (ASP NET MVC), которое досталось на поддержкуЧасть по аутентификации использует подключение к базе MS SQL Server Expres