Я думаю, это из-за исторических причин, смешанных с предотвращением дублирования кода.
В .Net 1.0 не было обобщений, поэтому для каждого типа, который может генерировать событие, вы были вынуждены определить делегат обработчика событий.
как:
public delegate void TextBoxEventHandler(TextBox sender, EventArgs e);
public delegate void ComboBoxEventHandler(ComboBox sender, EventArgs e);
так что вместо этого разработчики freamework создали один
public delegate void EventHandler(object sender, EventArgs e);
и использовали операторы cast / as.
Начиная с .Net 2.0 у нас есть дженерики, поэтому вы можете определить его один раз так
public delegate void EventHandler<TSender, TEventArgs>(TSender sender, TEventArgs e) where TEventArgs: EventArgs;
или даже
public delegate void EventHandler<TSender, TEventArgs>(TSender sender, TEventArgs e);
А потом используйте вот так.
public event EventHandler<TextBox, string> TextChanged;
public event EventHandler<ComboBox, EventArgs> SomeComboBoxEvent;
Но это сломало бы все приложения, написанные для .Net 1.0 / 1.1, поэтому разработчики фреймворков оставили все как есть. И теперь все используют эти предварительные классы.
Также я не уверен, может ли конструктор Windows Forms использовать универсальный EventHandler. Я никогда не пытался это проверить.
По моему мнению, типизированные (общие) события лучше, чем этот стандарт. Так что используйте его там, где можете.