2015-02-08 3 views
4

Я вижу операторы сравнения равенства == и != перегружены на System.Delegate и MulticastDelegate, но не += и -= операторов.Почему я не вижу, что оператор + = перегружен на System.Delegate?

Тогда как выполняются операции присваивания приращения и сокращения, связанные с экземплярами делегата?

+1

См. Также [+ = оператор для делегата] (http://stackoverflow.com/q/33964927/1364007), который был помечен как [дубликат] этого. –

+0

@WaiHaLee спасибо. Я сделал. :-) –

ответ

5

Компилятор C# переводит += оператору на вызов статического метода Delegate.Combine.

Существует несколько случаев, когда компилятор делает такие вещи, т. Е. оператор +System.String скомпилирован к вызову String.Concat. Поэтому нет метода op_Add в System.String.

0

Оператор += определяется оператором +.

См += Operator (C# Reference)

+0

Хорошая точка, но я не вижу даже операторов сложения или вычитания в классах. –

+0

@ WaterCoolerv2: типы делегатов, такие как типы массивов, немного «разные», поскольку среда выполнения автоматически генерирует множество членов. Вы не увидите их в документах библиотеки классов. –

0

При объявлении делегата как event, это на самом деле является обертка события вокруг делегата. Для получения дополнительной информации см. https://stackoverflow.com/a/4893006/397807. Короче говоря, вы можете добавить обработчик с += и удалить с помощью -=, а компилятор поможет перевести его на правильный вызов функции.

1

Оператор сложения и назначение соединения (+ =) оператор делегатов оба встроенных поддерживаются C# compiler.As 'языка C# Спецификация' The говорит: сочетание

делегат. Каждый тип делегата неявно предоставляет следующий предопределенный оператор, где D - тип делегата: Оператор D + (D x, D y); Оператор binary + выполняет объединение делегатов, когда оба операнда имеют тип делегата типа D. (Если операнды имеют разные типы делегатов, возникает ошибка времени привязки.) Если первый операнд имеет значение null, результатом операции является значение второго операнда (даже если это также нулевое значение). В противном случае, если второй операнд пуст, то результатом операции является значение первого операнда. В противном случае результатом операции будет новый экземпляр делегата, который при вызове вызывает первый операнд, а затем вызывает второй операнд. Примеры объединения делегатов см. В §7.8.5 и § 15.4. Поскольку System.Delegate не является типом делегата, оператор + для него не определен.

+0

Хех - это то, что [Джон Скит] (http://stackoverflow.com/users/22656/jon-skeet) сказал как [ответ] (http://stackoverflow.com/a/33964976/1364007) на [ этот дублированный вопрос] (http://stackoverflow.com/q/33964927/1364007). –

+0

Большое спасибо. –

Смежные вопросы