public delegate void Action<object?, EventArgs>(object? sender, EventArgs e);
public delegate void EventHandler(object? sender, EventArgs e);
В чем разница между этими двумя строками? Они кажутся функционально равными.





Если по факту, разницы нет:
EventHandler a;
Action<object?, EventArgs> b;
void c(object? o, EventArgs e) { }
void d() {
a = c; b = c; // no error
}
«EventHandler» введен только для удобства использования в любом месте для кода, связанного с событиями.
Ответ Ротабора в основном верен, за исключением рассуждения: EventHandler существует с версии .NET Framework 1.1, в которой не было дженериков и, следовательно, еще не было Action<T>. Разрешены только полностью определенные типы делегатов.
Когда Action (с его универсальными перегрузками) был добавлен в .NET Framework 2.0, EventHandler сохранился для обратной совместимости.
Ну, в версии 1.0 (и позже, включая версию 1.1) первым аргументом был просто object, а не object?. Также стоит отметить, что EventHandler и Action<> с object и object? представляют собой 4 разных типа и не всегда могут использоваться как взаимозаменяемые.
@ Flydog57 Есть ссылка на это? Если я не ошибаюсь, ссылочные типы, допускающие значение NULL (object?), — это всего лишь вещь компилятора, обрабатываемая атрибутами. Это вообще не влияет на сгенерированный код, поэтому типы одинаковы.
Возможно, я ошибаюсь. Определенно Action и EventHandler — это разные типы, как Predicate<T> и Func<T, bool>. Хотя легко проверить.
Высокая оценка за знание истории!