Это сводится к решению Language Design, поэтому, если не считать слова разработчиков, мы можем только догадываться.
Одна веская причина, безусловно, в том, что один является общим, а другой - нет.Обобщения по своей природе превосходят неуниверсальное решение (которое означает использование объекта в качестве типа), поскольку они поддерживают безопасность типов во время компиляции.Так что, возможно, был преднамеренный выбор порвать с предродовой версией.Чтобы избежать нисходящей совместимости.Обратите внимание, что большинство классов, которые реализуют Generic Version, не реализуют его неуниверсальный аналог.Действительно фундаментальные и старые вещи, такие как string, являются исключением - потому что они не могут удалить старый интерфейс, только добавить новые.
С нумераторами потребность кажется менее экстремальной.Перечислители, как правило, генерируются взамен или из коллекции и предназначены исключительно для чтения.Таким образом, у вас либо есть фиксированный тип для приведения, либо фиксированный тип для использования в Enumerator.
Другая причина, вероятно, состоит в том, что код, использующий IComparable, либо явно его требует (ограничения типа), либо состоит из элементов, сделанных из него.- и сам по себе является общим по определению.Чаще всего он используется для функций сортировки в общих коллекциях.Возможно, они больше не хотели использовать старые коллекции.А не поддержка IComparable для Dictionary, безусловно, был хорошим выбором, чтобы вывести HashTable (его предварительный аналог) из обращения.