Warum erkennt Var in der XmlNodeList-Schleife das Objekt type und nicht XmlNode?

8

Wenn man eine XmlNodeList wie folgt durchläuft

%Vor%

alles funktioniert wie erwartet - foo ist eindeutig vom Typ XmlNode und die VS.NET IDE zeigt Methoden und Felder.

Auf der anderen Seite

%Vor%

kompiliert nicht, weil hier foo vom Typ Objekt ist. Tippe Inferenz Art von Arbeiten, aber leitet Objekt ein.

Offenbar sind die Elemente von XmlNodeList nicht von einem Typ, aber wenn sie XmlNode statt var zugewiesen werden, geschieht dies implizit (Casting oder Unboxing).

Erste Frage: Was ist der Mechanismus dahinter?

Zweite (verwandte) Frage: Wie findet man die Typen, die man in dieser Art von Schleife verwenden kann? Hilft die VS.NET IDE?

    
Olaf 03.02.2012, 10:28
quelle

3 Antworten

9

XmlNodeList implementiert nur die nicht generische IEnumerable -Schnittstelle und nicht so etwas wie IEnumerable<XmlNode> mit Generika. Dies verhindert eine starke Typisierung ihrer Elemente, bis Sie sie entsprechend umgewandelt haben. Der Compiler hat keine andere Wahl, als die implizite Typdeklaration in Ihrer Foreach auf object abzubilden.

Wenn Sie darauf bestehen, das Schlüsselwort var zu verwenden, können Sie die Elemente von xmlNodeList wie folgt darstellen:

%Vor%

Aber das ist hässlich und erfordert sowieso mehr Tastenanschläge. Sie können auch XmlNode foo explizit deklarieren, und lassen Sie die foreach es für Sie im Handumdrehen.

    
BoltClock 03.02.2012, 10:30
quelle
4

Wie BoltClock bemerkt, implementiert XmlNodeList nur IEnumerable .

Die foreach Schleife bewirkt automatisch, dass Sie hinter die Kulissen treten, also:

%Vor%

ist völlig legal und führt einen Cast (der natürlich eine Ausnahme auslösen kann) für jeden Wert durch.

Es ist mir nicht wirklich klar, was Sie mit Ihrer zweiten Frage meinen - aber ich würde Ihnen nur empfehlen, dass Sie XmlNode explizit in Ihrer Schleife verwenden. Wenn Sie wirklich var verwenden möchten, könnten Sie schreiben:

%Vor%

aber das fühlt sich für mich wie Overkill an ...

    
Jon Skeet 03.02.2012 10:32
quelle
4

XmlNodeList befand sich bereits im .NET Framework, bevor generische Anwendungen unterstützt wurden. Aus diesem Grund implementiert es nur die nicht generische Schnittstelle IEnumerable und nicht die generische IEnumerable<T> .
Um zu wissen, welche Typen in dieser Liste enthalten sein können, müssen Sie die Dokumentation lesen. Der beste Weg ist der Indexer .

Übrigens: Seit Visual Studio 2005 wurde die IDE nicht VS.NET genannt :-) Seither heißt sie VS.

    
Daniel Hilgarth 03.02.2012 10:32
quelle

Tags und Links