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

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

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

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

Ответы [ 3 ]

8 голосов
/ 04 августа 2010

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

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

5 голосов
/ 04 августа 2010

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

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

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

2 голосов
/ 04 августа 2010

Это ограничение CLR. См. Почему C # (4.0) не допускает ко-и контравариантности в типовых типовых классах? для дополнительных комментариев.

...