Согласен, еще одно хорошее время игнорировать это правило, когда вам нужно сказать:
Func<IEnumerable<T>>
Конечно, вы можете использовать неуниверсальный IEnumerable, но тогда можно использовать любой тип, если он реализует IEnumerable (неуниверсальный). Цель обобщений (частично) состоит в том, чтобы ограничить типы, допустимые для данного набора типов.
Я думаю, что это правило очень глупо. нужно только если у вас есть несколько вложенных универсальных типов. один слой вложенности более чем безопасен.
Кстати, я думаю, что многие из функций LINQ также содержат общие типы, поэтому, если MS это сделает, мы тоже сможем:)