Covariance (`out`) in Generic Interfaces & Delegates
1Concept
Covariance (`out T`) allows assigning a more derived type to a less derived interface (`IEnumerable<string>` -> `IEnumerable<object>`). Covariant type parameters can only appear as return values.
2Architecture Diagram
Inheritance: string (Derived) ──> object (Base) Covariance (`out T`): IReadOnlyList<string> (Derived) ──────> Can assign to ──────> IReadOnlyList<object> (Base)
3Code Example
C# 13 & .NET 9
using System;
using System.Collections.Generic;
public class CovarianceDemo
{
public static void PrintObjects(IEnumerable<object> items)
{
foreach (var item in items)
{
Console.WriteLine($"Item: {item}");
}
}
public static void Main()
{
List<string> words = new List<string> { "Cloud", "Microservice", "Kubernetes" };
// Legal because IEnumerable<out T> is covariant!
PrintObjects(words);
}
}4Expected Output
Item: Cloud Item: Microservice Item: Kubernetes
5Key Takeaways
- ✓`out T` marks a type parameter as covariant (producer only).
- ✓Covariance only works with reference types (not value types).
- ✓`IReadOnlyList<out T>`, `IEnumerable<out T>`, and `Func<out T>` are covariant.