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 foreachlikewise picks up aGetAsyncEnumeratorextension method