El foreachbucle tiene un reparto implícito. Es más o menos así:
using (IEnumerator<Test> iterator = list.GetEnumerator())
{
while (iterator.MoveNext())
{
IDisposable item = (IDisposable) iterator.Current;
// Body of foreach loop here
}
}
Antes de los genéricos, eso era mucho más práctico que tener que enviar el código fuente. Ahora no es tan importante, pero sería extraño que no se compilara. Tenga en cuenta que el compilador se compruebe que es al menos posible . Si usa foreach (string item in list)eso, no se compilaría, porque a Testno puede ser a string, pero a Test puede ser un IDisposable, porque podría referirse a una instancia de una subclase de Testesos implementos IDisposable. Si se Testsella la clase, no se compilará incluso con ella IDisposable, porque entonces una Testinstancia no se puede implementar IDisposable.
Básicamente, se compilará si se compila una conversión del Testtipo de iteración, y de lo contrario no se compilará. Pero fallará en el tiempo de ejecución si un lanzamiento normal también falla en el tiempo de ejecución.
Testlos cuales no aplicarIDisposable. Efectivamente, el foreach intenta lanzar cada elemento a la interfaz y lanza una excepción si esto falla. Lo mismo que si escribieras(IDisposable)currentElement. Sin embargo, no puedo ver por qué no debería compilarse en la clase concreta.