Covariance and contravariance concepts in .NET generics. Covariance allows implicit conversion from derived to base types, like converting a List<string> to IEnumerable<object>. Contravariance allows converting parameters from base to derived types, like allowing a method that takes an object to be assigned to a delegate that expects a string. In .NET 4, generics support covariance for out type parameters and contravariance for in parameters through interface and delegate type variance annotations.