Как мне исправить эту ошибку: «MyEvent + = expected»?

У меня есть представитель, говорят:

public delegate void MyDelegate();

У меня мероприятие, говорят:

public MyDelegate MyEvent;

При вызове события я получаю сообщение об ошибке:

"MyEvent += expected ....."

Как мне решить эту проблему?

Какой код вы используете для вызова этого события?

Bryan Watts 16.11.2008 21:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
159
5

Ответы 5

Вы можете вызвать событие только из класса, в котором вы его объявили. В любом другом месте вы можете добавлять или удалять обработчики из делегата события только с помощью операторов += и -=, отсюда и сообщение об ошибке.

Также вы можете посмотреть этот пост о избегая проверки нулевых делегатов

Если вы пытаетесь использовать событие из другого класса, вам необходимо понимать разницу между событиями и делегатами. Событие просто инкапсулирует аспекты «подписаться» и «отказаться от подписки», а не «инициировать событие». (Фактически, в IL у вас есть член может для «поднять событие», но C# его не поддерживает.)

Подробнее см. моя статья о мероприятиях и делегатах.

Я всегда удивлялся, что C# не поддерживает метод Raise с тех пор, как VB и даже C++ / CLI поддерживают, и иногда это довольно удобно. Вы знаете причину этого решения?

Konrad Rudolph 16.11.2008 22:14

На мой взгляд, это нарушает инкапсуляцию. Класс должен сам отвечать за возникновение событий - шаблон событий является наблюдательным. Я никогда не сталкивался с ситуацией, когда я хотел бы вызвать событие "извне", но имел причину хорошо для этого (а не какой-то грубый дизайн в другом месте).

Jon Skeet 16.11.2008 22:32

+ = связан с событиями, а не только с объявлением делегата. Вам не хватает ключевого слова "событие".

public **event** MyDelegate MyEvent;

Когда у вас есть это ключевое слово, + = будет работать на вас.

Ознакомьтесь с Chris Sells Делегаты .NET: сказка на ночь на C#, чтобы получить отличное руководство для делегатов и мероприятий. Информативно и довольно занимательно.

Другие вопросы по теме