2010-08-02 12 views
6

Wenn ich eine foreach Schleife in C# verwende, scheint es, dass keine Kompilierzeit Typprüfung durchgeführt wird, wenn der Elementtyp ein Schnittstellentyp ist.Warum überspringt foreach die Überprüfung der Kompilierzeit für Schnittstellentypen?

z.

Dies wird gerne kompilieren und eine Ausnahme zur Laufzeit verursachen, wenn es bei der Kompilierung klar ist, macht dies keinen Sinn. Wenn ich den Elementtyp aus SomeInterface in einer anderen Klasse zu ändern, kompiliert dann Zeit Typprüfung gestellt wird:

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

Warum gibt es keine Kompilierung Typüberprüfungen Zeit, wenn der Elementtyp eine Schnittstelle?

(Dies geschieht mit .NET 3.5 SP1 in Visual Studio 2008)

+0

Ja, ich habe mich gefragt, über (und gebissen worden), um die gleiche Sache. Ich freue mich auf die Antworten von denen, die Bescheid wissen! – Eyvind

Antwort

8

nicht klar, bei der Kompilierung ist, ob ein anderer Teil des Programms, vielleicht in einem anderen Projekt hat:

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

Jetzt ist die Laufzeitprüfung ERFOLGREICH.

Wenn Sie SomeClass als sealed markieren, ist dies nicht möglich, und es ist wieder möglich, zur Kompilierzeit zu wissen, dass die Besetzung niemals funktioniert.

+0

Was Sie sagen, ist richtig. Ich bin überrascht, dass C# diesen Ansatz mit "foreach" verfolgt, da es die Sprache inkonsistent macht. Methodenaufrufe haben beispielsweise nicht dasselbe Verhalten. – pauldoo

+0

+1 PERFEKTE Antwort. Daran habe ich noch nicht gedacht. –

+0

Es ist nicht inkonsistent, es ist das gleiche Verhalten wie Casting, betrachten: 'foreach (SomeClass obj im Zeug) ((ISomeInterface) obj) .SomeInterfaceMethod();' –

Verwandte Themen