El foreach
bucle 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 Test
no puede ser a string
, pero a Test
puede ser un IDisposable
, porque podría referirse a una instancia de una subclase de Test
esos implementos IDisposable
. Si se Test
sella la clase, no se compilará incluso con ella IDisposable
, porque entonces una Test
instancia no se puede implementar IDisposable
.
Básicamente, se compilará si se compila una conversión del Test
tipo 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.
Test
los 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.