C# : Is Variance (Covariance / Contravariance) another word for Polymorphism?
c#, contravariance, covariance, polymorphism, variance
Solution
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.
Problem
I am trying to figure out the exact meaning of the words `Covariance` and `Contravariance` from several articles online and questions on StackOverflow, and from what I can understand, it's only another word for polymorphism. Am I correct with the above statement? Or have I got it wrong ?