Вы можете foreach через любой объект, который реализует IEnumerable
или IEnumberable
Нет необходимости реализовывать интерфейс IEnumerable для использования оператора foreach. Вот цитата из MSDN (http://msdn.microsoft.com/en-us/library/9yb8xew9.aspx):
В C# это не обязательно для класса коллекции, чтобы наследовать от IEnumerable и IEnumerator по порядку быть совместимым с foreach. Пока так как в классе есть необходимые GetEnumerator, MoveNext, Reset и Текущие участники, он будет работать с для каждого. Исключение интерфейсов преимущество в том, что вы можете определить тип возвращаемого значения Current для быть более конкретным, чем Object, который обеспечивает безопасность типов.
Полное объяснение: http://msdn.microsoft.com/en-us/library/aa664754%28VS.71%29.aspx