Подтвердить что ты не робот

Определение событий С# без определения внешнего делегата

просто из любопытства: можно ли определять события на С# без указания типа делегирования?

что-то вроде public event (delegate void(int)) EventName

4b9b3361

Ответ 1

Нет, это невозможно; ECMA-334, § 17.7 гласит:

Тип объявления события должен быть типом делегата (§11.2)

и § 11.2 определяет:

delegate-type:
    type-name

Однако, поскольку С# 3, вы можете использовать различные предопределенные общие типы, такие как Action<int>, так что вам почти не нужно определять собственные типы делегатов.

Ответ 2

Там встроены общие типы делегатов, Action<> и Func<>, где Action возвращает void. Каждый родовой аргумент типа является типом типа аргумента, который должен быть передан делегату. например.

public event Action<int> EventName;

Кроме того, существует общий EventHandler<T>, который следует за соглашением о передаче отправителя объекта и имеет тип EventArgs.

Ответ 3

Нет, AFAIK это невозможно с С#.

Причина, по которой я так думаю, что событие .NET в основном является делегатом с добавленными ограничениями. То есть ключевое слово event не определяет новый тип; концептуально говоря, он больше похож на модификатор (думаю такие вещи, как private или readonly), который используется в объявлении для изменения уже существующего типа делегата. Это модификация, которая добавляет ограничения:

public EventHandler x;

Это нормальный делегат, который может быть передан (скопирован) и вызван кем-либо.

public event EventHandler x;

Под капотом это тоже нормальный делегат, но его можно установить (=) и вызывать тип, содержащий x; кроме того, делегат не может быть передан третьим лицам; они могут выполнять только операции add (+=) и remove (-=).