C# : Is Variance (Covariance / Contravariance) another word for Polymorphism?

It’s certainly related to polymorphism. I wouldn’t say they’re just “another word” for polymorphism though – they’re about very specific situations, where you can treat one type as if it were another type in a certain context.

For instance, with normal polymorphism you can treat any reference to a Banana as a reference to a Fruit – but that doesn’t mean you can substitute Fruit every time you see the type Banana. For example, a List<Banana> can’t be treated as a List<Fruit> because list.Add(new Apple()) is valid for List<Fruit> but not for List<Banana>.

Covariance allows a “bigger” (less specific) type to be substituted in an API where the original type is only used in an “output” position (e.g. as a return value). Contravariance allows a “smaller” (more specific) type to be substituted in an API where the original type is only used in an “input” position.

It’s hard to go into all the details in a single SO post (although hopefully someone else will do a better job than this!). Eric Lippert has an excellent series of blog posts about it.

Leave a Comment