Хорошее практическое применение ковариации и контравариантности в .NET 4.0? - PullRequest
4 голосов
/ 27 мая 2010

Я хочу познакомиться с недавним выпуском .NET Framework 4.0 и его Covariance and Contravariance in Generics.

Несмотря на то, что я прочитал то, что написано по указанной ссылке, я не могу понять, как это следует использовать, а когда - нет.

Краткое описание и простой реальный пример кода приветствуются.

Спасибо! =)

1 Ответ

6 голосов
/ 27 мая 2010

Эрик Мейер говорил со Скоттом Хансельманом о Reactive Framework в одном из последних подкастов Скотта, и одна из вещей, которые сказал Эрик, заключалась в том, что в .NET 4.0 IEnumerable ковариантен, а в .NET 3.5 IEnumerable - нет.

Это означает, что если у вас есть объект Banana, который наследуется от Fruit, вы можете присвоить банан переменной Fruit, но вы не можете передать IEnumerable бананов методу, ожидающему фрукт IEnumerable в .NET 3.5, потому что IEnumerable не является ковариантным.

Из подкаста:

Если у меня есть массив бананов, я могу опубликовать, где вам нужен массив фрукты, потому что банан является подтипом фрукты, так что если у меня есть множество бананов и вам нужно множество фруктов, я могу передать вам этот массив. Теперь, если вы ожидаю много фруктов, я не может передать вам множество бананы потому что перечислимы до .NET 4.0 не был ковариантным. Так что тот факт, что хотя банан является особенным фруктовый, банановый не было перечисляемых фруктов.

...