Тип объявления события должен быть типом делегата (§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 (-=).