Примеры хороших, реальных случаев использования ковариации и контравариантности в C # 4.0? - PullRequest
6 голосов
/ 27 августа 2010

До выхода C # 4.0 я был очень взволнован ковариацией и контравариантностью.Это потворствовало моей любви к теоретической правильности!

Однако теперь, когда это вышло, и я вернулся к написанию нормального, повседневного, скучного кода, я начинаю задумываться: я когда-нибудь его уже использовал?И я замечаю, что я не использовал это сознательно.Ни один из интерфейсов или делегатов, которые я определил с тех пор, не выиграл от этого.

Существует только один единственный случай, в котором я позже обнаружил, что я невольно использовал ковариацию, но это очень тонкий и я могтак же не заметил этого.Представьте, что X является базовым классом, а Y является его потомком:

if (enumerableOfYs.Contains(variableOfTypeX))

Существуют ли какие-нибудь интересные или захватывающие примеры, когда любой из вас, ребята, использовал ковариацию или контравариантность в реальной жизни?, не надуманный сценарий использования, и он действительно спас день, будучи впечатляюще «правильным»?

Ответы [ 4 ]

9 голосов
/ 29 августа 2010

Единственное "дисперсионное" использование в реальном мире, с которым я столкнулся в своих реальных программах написания программ для клиентов (в отличие от написания тестовых примеров или статей компилятора или чего-либо еще), - это то, что я теперь могу передать IEnumerable<TypeParameterDefinedInSource>к методу, который ожидает IEnumerable<TypeSymbol>, когда я пишу инструменты анализа кода на C #.

Это на самом деле не функция типа «сохранить день».Это скорее «работает так, как я ожидаю».

3 голосов
/ 28 августа 2010

Я просмотрел великолепный двухсерийный видеоклип на тему ковариации и контравариантности Эрика Липперта, одного из разработчиков этой функции.Видео содержат четкое объяснение того, как работает эта функция;однако примеры придуманы для демонстрации.

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

С другой стороны, я наконец могу поместить IEnumerable<DerivedClass> в метод, ожидающий IEnumerable<BaseClass>, не перепрыгивая через обруч приведения типов.В конце концов, я, вероятно, забуду, что никогда не мог.Я думаю, что это будет наиболее убедительное и распространенное использование ковариации / контравариантности: сверхтонкие вещи, которые просто работают , тогда как в более ранних версиях .NET они не работали.1021 *

1 голос
/ 27 августа 2010

Такие функции, как ковариация и контравариантность, на самом деле не «спасают день».Скорее, при правильном использовании они облегчают последующее обслуживание.Таким образом, это очень похоже на константность в C ++.Это не добавляет никакой силы, но написанный код использует его правильно, и с системой намного проще работать.

ПРИМЕЧАНИЕ: я еще не использовал его, потому что я только что обновился до VS 2010.

0 голосов
/ 27 августа 2010

Я использовал C # около трех лет, и я помню только когда-либо «отсутствующие» функции отклонения, возможно, один или два раза.

Возможно, теперь, когда они переведены на язык, я найду больше возможностей воспользоваться ими, но я думаю, что в лучшем случае они являются "второстепенными" функциями.

(мне интересно посмотреть, какие другие ответы появляются здесь.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...