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?
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:
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.
Wie BoltClock bemerkt, implementiert XmlNodeList
nur IEnumerable
.
Die foreach
Schleife bewirkt automatisch, dass Sie hinter die Kulissen treten, also:
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:
aber das fühlt sich für mich wie Overkill an ...
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.
Tags und Links c# xml type-inference