Covariance and contravariance features were introduced in C# 4.0. Covariance and contravariance enable implicit reference conversion for array types, delegate types, and generic type arguments. Covariance preserves assignment compatibility and contravariance reverses it.
For example, in the case of generics, Covariance allows casting of generic types to base types, for example, IEnumerable<A> will be implicitly convertible to an IEnumerable<B> if A can implicitly be converted to B and Contravariance reverses it.
// List of string
IList<string> arrNames = new List<string>();
// Convert it to IEnumerable collection of objects
IEnumerable<object> objects = arrNames;
Here are some detailed articles on the same topic.