Phase 9 of 30 · Topic 9.3

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.