Answer
Generic variance allows compatible reference-type conversions for selected generic interfaces and delegates. • Covariance uses out and permits conversion toward a less derived output type. • Contravariance uses in and permits conversion toward a more derived input type. • Variance applies only to reference types and only where the generic declaration permits it.
💡 C# Example
IEnumerable<string> words = new List<string> { "C#" };
IEnumerable<object> objects = words;
Action<object> printObject = Console.WriteLine;
Action<string> printString = printObject;
⚡ Quick Revision
out is covariance for produced values; in is contravariance for consumed values.