2010-05-27 15 views

Répondre

6

Eric Meijer discutait avec Scott Hanselman du Reactive Framework dans l'un des récents podcasts de Scott, et l'une des choses qu'Eric a dit était que, dans .NET 4.0, IEnumerable est covariant, mais dans .NET 3.5 IEnumerable n'est pas.

Ce que cela signifie est que, si vous avez un objet Banana qui hérite de Fruit, vous pouvez affecter la banane à une variable de fruits, mais vous ne pouvez pas passer une IEnumerable de bananes à une méthode qui attend un fruit IEnumerable dans .NET 3.5 , parce que IEnumerable n'est pas covariant.

Depuis le podcast:

Si j'ai un tableau de bananes, je peux après que lorsque vous avez besoin d'un éventail de fruits parce que la banane est un sous-type de fruits, donc si j'ai une tableau de bananes et vous avez besoin d'un tableau de fruits que je peux vous transmettre ce tableau. Maintenant, si vous attendez un nombre de fruits, je ne peux pas vous passer un nombre de bananes de car enumerable jusqu'à .NET 4.0 n'était pas covariant. Donc le fait que même si la banane est un type de fruit spécial, un nombre de banane n'était pas un fruit dénombrable.

+0

Pas vraiment un exemple super-réel, ey? :) – cwap

+0

@cwap: Pouvoir passer une collection covariant est une véritable préoccupation de programmation; Dans un cas, vous pouvez simplement passer la collection, dans l'autre cas, vous devez copier chaque élément de la collection dans une nouvelle collection. Si vous voulez vraiment l'exemple du monde réel, écoutez le podcast. Eric explique en détail pourquoi cela était important lors de la conception du cadre réactif. –

+0

Accordé, n'a pas écouté le podcast :) Au premier coup d'œil, je ne pensais tout simplement pas que Banana: Fruit, était un excellent exemple du monde réel - Mais nous sommes d'accord que c'est une fonctionnalité géniale! – cwap