Хорошее практическое применение ковариации и контравариантности в .NET 4.0?

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

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

Приветствуются краткое объяснение и простой реальный образец кода.

Спасибо! знак равно


person Will Marcouiller    schedule 27.05.2010    source источник


Ответы (1)


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

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

Из подкаста:

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

person Robert Harvey    schedule 27.05.2010
comment
Не совсем реальный пример, а? :) - person cwap; 27.05.2010
comment
@cwap: возможность передать ковариантную коллекцию - это серьезная проблема программирования; в одном случае вы можете просто передать коллекцию, в другом случае вы должны скопировать каждый элемент коллекции в новую коллекцию. Если вам действительно нужен реальный пример, послушайте подкаст. Эрик подробно объясняет, почему это было важно при разработке Reactive Framework. - person Robert Harvey; 27.05.2010
comment
Конечно, не слушал подкаст :) На первый взгляд я просто не подумал, что Banana: Fruit - отличный пример из реального мира - но мы согласны с тем, что это отличная функция! - person cwap; 28.05.2010