Эрик Мейер беседовал с Скоттом Ханзельменом о Reactive Framework в одном из недавних подкастов Скотта, и одна из вещей, которые сказал Эрик, - это то, что в .NET 4.0 IEnumerable ковариантно, но в .NET 3.5 IEnumerable не является.
Что это означает, что, если у вас есть Banana
объекта, который наследует от Fruit
, вы можете присвоить банан переменных фруктов, но вы не можете передать IEnumerable
бананов к способу, ожидая плоды IEnumerable в .NET 3.5 , потому что IEnumerable не является ковариантным.
Из подкаста:
Если у меня есть массив бананов, я могу пост, который где нужен массив фруктов, потому что банан является подтипом фруктов, так что если у меня есть массив бананов , и вам нужен массив фруктов, я могу передать вам этот массив. Теперь, если вы ожидаете перечислимого из фруктов, я не может передать вам перечислимый из бананов, потому что перечислимый до .NET 4.0 не был ковариантным. Так что тот факт, что банан - особый вид фруктов, перечислимый бананом не был перечислимым фруктом.
Не очень-то пример реального мира, ey? :) – cwap
@cwap: возможность пройти коллекцию ковариантов - это настоящая проблема программирования; в одном случае вы можете просто передать коллекцию, в другом случае вы должны скопировать каждый элемент в коллекции в новую коллекцию. Если вам действительно нужен пример реального мира, послушайте подкаст. Эрик подробно объясняет, почему это было важно при разработке Reactive Framework. –
Конечно, не слушал подкаст :) На первый взгляд я просто не думал, что Банана: Фрут, был таким замечательным примером в мире - Но мы согласны с тем, что это отличная возможность! – cwap