Подтвердить что ты не робот

Почему С# 4.0 ковариация/контравариантность ограничена параметризованным интерфейсом и типами делегатов?

Является ли это ограничением CLR или существуют проблемы совместимости с существующим кодом?

Связано ли это с испорченной дисперсией объединения делегатов в С# 4.0?

Изменить: Можно ли иметь язык, использующий совместную/контравариантность, без этого ограничения, действующего на CLR?

4b9b3361

Ответ 1

Простой ответ: это ограничение CLR.

(Я не видел ничего хорошего, конкретного объяснения этого в любом месте... Я не помню, чтобы он видел в блоге блога Эрика об этом, хотя я, возможно, пропустил его где-то.)

Я бы сказал, что и делегаты, и интерфейсы уже образуют "слои косвенности" над реальными типами; взгляды на методы или классы, если хотите. Переход от одного взгляда к другому взгляду достаточно разумен. Фактический класс чувствует себя как более конкретное представление для меня - и переход от одного конкретного представления к другому чувствует себя менее разумным. Это очень трогательное объяснение, а не подлинное техническое ограничение.

Ответ 2

Вы захотите прочитать сообщение Эрика Липперта о том, почему он работает так, как он делает. Короче говоря, они допускают как можно больше различий, не позволяя разработчикам делать плохие ошибки в программировании, что может вызвать затруднение отслеживания ошибок. Объем отклонения в 4.0 значительно расширяется по сравнению с правилами 3.0, и из того, что я понимаю, это баланс между тем, что является benificial для разработчика, и тем, что можно безопасно разрешить, не вызывая слишком много головной боли из-за непреднамеренных ошибок.

http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/default.aspx