La covariance ça sert pas mal en fait, souvent sans même y penser : ça parait assez naturel qu'une List<Giraffe> puisse être considérée comme un IEnumerable<Animal> (il faut réfléchir un peu plus pour comprendre pourquoi ce n'est pas une IList<Animal> mais bon...). La contravariance c'est un peu plus rare, mais ça arrive quand même de s'en servir. Par exemple, si tu as un IEqualityComparer<Animal>, ça semble logique qu'il puisse servir de IEqualityComparer<Giraffe> (s'il peut comparer des animaux, il peut comparer des girafes). Bon après, c'est sûr qu'on définit pas des interface ou délégués co- ou contravariants tous les jours...
dynamic, pour le coup, je ne m'en sers absolument pas. C'est utile pour des scénarios assez spécifiques, comme l'interop avec Office ou avec des langages dynamiques, mais en dehors de ça je ne vois pas vraiment l'intérêt.
Mais dans l'ensemble c'est vrai que la plupart des features ajoutées à C# ont une vraie utilité, et sont d'habitude assez largement adoptées. Même des features "gadgets" comme les paramètres optionnels ont leur utilité et permettent de "fluidifier" l'écriture et la lecture du code.
Partager