9
votes

Pourquoi Var Inférer Type Object et non XMLNode dans la boucle XMLnodelist?

Si on boucle à travers un xmlnodeliste comme celui-ci xxx

tout fonctionne comme prévu - FOO est clairement de type xmlnode et le vs.net IDE affiche des méthodes et des champs .

d'autre part xxx

n'est pas compilé car ici foo est de type objet . TYPE INFERENCE Sorte de travaux mais infère objet .

Apparemment, les éléments de xmnodeliste ne sont pas un type défini , mais l'attribuant à xmlnode au lieu de var fait quelque chose implicitement (casting ou nonbal).

Première question: quel est le mécanisme derrière cela?

Deuxième question (liée): Comment trouver les types que l'on peut utiliser dans ce type de boucle? Est-ce que l'IDE vs.net aide?


3 commentaires

Vous voudrez peut-être utiliser les classes de l'espace de noms System.xml.Linq, car ils mettent en œuvre les versions génériques iEnumérables entre autres. Le var doit être déduit correctement lorsque vous utilisez ces classes. Ymmv


@Chris: Merci pour le conseil - je vais vérifier.


+1, j'allais juste poser la même question :-)


3 Réponses :


10
votes

xmlnodeliste Implémente uniquement l'interface iEnumerable non générique, et non quelque chose comme iEnumerable avec des génériques. Cela empêche une forte frappe de ses éléments jusqu'à ce que vous soyez de manière appropriée, le compilateur n'a donc pas d'autre choix que de cartographier la déclaration de type implicite sur objet dans votre foreach.

Si vous insistez sur l'utilisation du var mot-clé, vous pouvez lancer les éléments de xmlnodelist comme: xxx

Mais c'est moche et nécessite plus de frappes de frappes. Vous pouvez également simplement déclarer explicitement xmlnode foo et laisser le pourchaire le jeter pour vous à la volée.


2 commentaires

Merci beaucoup, compris! Je ne veux pas laid, mais comme je l'ai écrit dans mon commentaire à Jon, la question avait une partie pratique: si Resharper me donne «Var», quel est le moyen le plus rapide de trouver le type réel?


Comme Daniel Hilgarth souligne, le moyen le plus simple de le faire est de regarder la documentation.



4
votes

comme bolllock notes, xmlnodeliste uniquement implémente ienumerable .

La boucle foreach moulage automatiquement pour vous dans les coulisses, donc ceci : xxx

est entièrement légal et effectue une distribution (qui peut lancer une exception, bien sûr) sur chaque valeur.

Ce n'est pas vraiment clair pour Moi ce que vous entendez par votre deuxième question - mais je vous recommanderais simplement que vous utilisez explicitement xmlnode dans votre boucle. Si vous vraiment veux utiliser var , vous pouvez écrire: xxx

mais cela ressemble à la surkill .. .


3 commentaires

Merci, iEnumerable vs. iEnumerable l'explique! Avec ma deuxième question, je voulais dire: dans un cas comme celui-ci, quel est le moyen le plus rapide de trouver le type d'article dont j'ai besoin, dans ce cas "xmlnode"? Resharber me donne «Var», alors je me demandais si le vs.net l'a caché quelque part dans son intellisense.


@Oolaf: Non, il ne peut y avoir d'intellensense, car les informations ne sont tout simplement pas là. Vous devez savoir ce que vous faites - ce que vous devriez quand même, bien sûr :)


C'est ce que je voulais savoir (les informations ne sont tout simplement pas là). Merci de m'aider à savoir ce que je fais!



4
votes

XMLnodelist a été dans le document .NET avant de soutenir les génériques. À cause de cela, il implémente uniquement l'interface non générique ienumerable et non le générique ienumerable .
Pour savoir quels types peuvent figurer dans cette liste, vous devez lire la documentation. Le meilleur moyen est le indexer .

BTW: L'IDE n'a pas été appelé vs.net car Visual Studio 2005 a été publié :-) Elle s'appelle VS seulement depuis.


1 commentaires

Merci également à l'indice vs.net (nous l'utilisons toujours en interne)!