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>(); // covarianceReal-world example Returning IEnumerable<Animal> from a method that actually yields Dogs.