Skip to content

Extension GetEnumerator C# 9.0extensibility

Extension methods allow foreach to enumerate over new types.

The foreach keyword allows you to loop over items in an enumerable collection. Prior to C# 9 this included arrays, dynamic objects, and objects from classes that implemented the GetEnumerator method or IEnumerable interface.

This feature allows foreach to use a GetEnumerator extension method automatically when available.

Code ​

csharp
void PrintAddress()
{
    foreach (var line in address)
        Console.WriteLine(line);
}

static class Extension
{
    public static IEnumerator<string> GetEnumerator(this Address address)
    {
        return new AddressLineEnumerator(address);
    }
}
csharp
void PrintAddress()
{
    foreach (var line in new AddressLineEnumeratorAdapter(address))
        Console.WriteLine(line);
}

// foreach only needs a public GetEnumerator method, not the IEnumerable interface
class AddressLineEnumeratorAdapter
{
    readonly Address address;

    public AddressLineEnumeratorAdapter(Address address)
    {
        this.address = address;
    }

    public IEnumerator<string> GetEnumerator()
    {
        return new AddressLineEnumerator(address);
    }
}

Notes ​

  • await foreach likewise picks up a GetAsyncEnumerator extension method

More information ​

Powered by Intracia