Я думаю, что есть веская причина для этого соглашения.
Давайте возьмем (и расширим) пример @ erikkallen:
void SomethingChanged(object sender, EventArgs e) {
EnableControls();
}
...
MyRadioButton.Click += SomethingChanged;
MyCheckbox.Click += SomethingChanged;
MyDropDown.SelectionChanged += SomethingChanged;
...
Это возможно (и это было с .Net 1, до генериков), потому что поддерживается ковариация.
Ваш вопрос имеет смысл, если вы идете сверху вниз - то есть вам нужно событие в вашем коде, поэтому вы добавляете его в свой контроль.
Тем не менее, условием является упрощение написания компонентов. Вы знаете, что для любого события будет работать базовый шаблон (отправитель объекта, EventArgs e).
Когда вы добавляете событие, вы не знаете, как оно будет использоваться, и вы не хотите произвольно ограничивать разработчиков использованием вашего компонента.
Ваш пример общего, строго типизированного события имеет смысл в вашем коде, но не подходит для других компонентов, написанных другими разработчиками. Например, если они хотят использовать ваш компонент с вышеуказанными:
//this won't work
GallowayClass.Changed += SomethingChanged;
В этом примере дополнительное ограничение типа просто создает боль для удаленного разработчика. Теперь им нужно создать нового делегата только для вашего компонента. Если они загружают ваши компоненты, им может понадобиться делегат для каждого из них.
Я считаю, что соглашение стоит соблюдать для всего внешнего или того, что вы ожидаете использовать вне тесной команды.
Мне нравится идея общих аргументов событий - я уже использую нечто подобное.