Почему С# 4.0 ковариация/контравариантность ограничена параметризованным интерфейсом и типами делегатов?
Является ли это ограничением CLR или существуют проблемы совместимости с существующим кодом?
Связано ли это с испорченной дисперсией объединения делегатов в С# 4.0?
Изменить:
Можно ли иметь язык, использующий совместную/контравариантность, без этого ограничения, действующего на CLR?
Ответы
Ответ 1
Простой ответ: это ограничение CLR.
(Я не видел ничего хорошего, конкретного объяснения этого в любом месте... Я не помню, чтобы он видел в блоге блога Эрика об этом, хотя я, возможно, пропустил его где-то.)
Я бы сказал, что и делегаты, и интерфейсы уже образуют "слои косвенности" над реальными типами; взгляды на методы или классы, если хотите. Переход от одного взгляда к другому взгляду достаточно разумен. Фактический класс чувствует себя как более конкретное представление для меня - и переход от одного конкретного представления к другому чувствует себя менее разумным. Это очень трогательное объяснение, а не подлинное техническое ограничение.
Ответ 2
Вы захотите прочитать сообщение Эрика Липперта о том, почему он работает так, как он делает. Короче говоря, они допускают как можно больше различий, не позволяя разработчикам делать плохие ошибки в программировании, что может вызвать затруднение отслеживания ошибок. Объем отклонения в 4.0 значительно расширяется по сравнению с правилами 3.0, и из того, что я понимаю, это баланс между тем, что является benificial для разработчика, и тем, что можно безопасно разрешить, не вызывая слишком много головной боли из-за непреднамеренных ошибок.
http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/default.aspx
Ответ 3
Это ограничение CLR. См. Почему С# (4.0) не разрешает совместную и контравариантность в типах общих типов? для дополнительного комментария.