C# › Generics

What is covariance and contravariance in generics?

Intermediate

Answer

out (covariant) lets you use a more-derived type where a less-derived is expected (IEnumerable<out T>); in (contravariant) lets a less-derived be used where more-derived is expected (IComparer<in T>).
IEnumerable<object> objs = new List<string>(); // covariance
Real-world example Returning IEnumerable<Animal> from a method that actually yields Dogs.