2010-08-02 7 views
6

Cuando uso un ciclo foreach en C#, parece que no se realiza ninguna verificación de tipo de tiempo de compilación si el tipo de elemento es un tipo de interfaz.¿Por qué foreach omite la verificación del tipo de tiempo de compilación en los tipos de interfaz?

E.g.

class SomeClass {} 
interface SomeInterface {} 

IEnumerable<SomeClass> stuff; 
foreach(SomeInterface obj in stuff) { // This compiles - why!? 
} 

Esto felizmente compilar y provocar una excepción en tiempo de ejecución, cuando es evidente en tiempo de compilación esto no tiene sentido. Si cambio el tipo de elemento SomeInterface a otra clase, entonces el tiempo de compilación verificación de tipos se restaura:

IEnumerable<SomeClass> stuff; 
foreach(Random obj in stuff) { // This doesn't compile - good! 
} 

¿Por qué hay ninguna comprobación de tipos en tiempo de compilación cuando el tipo de elemento es una interfaz?

(Esto ocurre con .NET 3.5 SP1 en Visual Studio 2008)

+0

Sí, me he preguntado (y me han mordido) lo mismo. ¡Esperamos las respuestas de aquellos que saben! – Eyvind

Respuesta

8

no está claro en tiempo de compilación si otra parte del programa, tal vez en un proyecto diferente, tiene:

class SomeOtherClass : SomeClass, ISomeInterface 
{ 
    public static IEnumerable<SomeClass> GetSomeStuff() 
    { 
     for(int i = 0; i<10; ++i) 
     yield return new SomeOtherClass(i); 
    } 
} 

Ahora el control del tiempo de ejecución TIENE ÉXITO.

Si marca SomeClass como , entonces esto no es posible, y de nuevo es posible saber en tiempo de compilación que el modelo nunca funcionará.

+0

Lo que dices es correcto. Me sorprende que C# adopte este enfoque con "foreach", ya que hace que el lenguaje sea inconsistente. Las llamadas a métodos no tienen este mismo comportamiento, por ejemplo. – pauldoo

+0

+1 respuesta PERFECTA. No lo había pensado antes. –

+0

No es incoherente, es el mismo comportamiento que el casting, considere: 'foreach (SomeClass obj en cosas) ((ISomeInterface) obj) .SomeInterfaceMethod();' –

Cuestiones relacionadas