Под выражением «foreach использует перечислимый объект» вы подразумевали «foreach использует перечислитель, заданный перечисляемой коллекцией».

ли foreach автоматически вызывает Dispose для любого объекта, реализующего IDisposable?

http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx кажется, указывает, что это делает:

* В противном случае выражение коллекции относится к типу, который реализует System.IEnumerable, и расширение оператора foreach выглядит так:

IEnumerator enumerator = 
        ((System.Collections.IEnumerable)(collection)).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      ElementType element = (ElementType)enumerator.Current;
      statement;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}

Ответы на вопрос(2)

Ваш ответ на вопрос