2010-05-07 2 views
3

Comment Visual Studio/intellisense sait quoi faire avec une variable déclarée comme var même si vous n'incluez pas la déclaration using nécessaire en haut?var mot clé sans 'using someNamespace'

Par exemple, j'ai la classe MyDomainObject définie dans un espace de noms différent Si je ne déclare using TheOtherNameSpace; dans le fichier le code suivant ne compile pas:

private void Foo() 
{ 
    MyDomainObject myObj = new MyDomainObject(); 
    // Doesn't know what this class is 
} 

Mais si j'utilise var

var myObj = new MyDomainObject(); 

Cela va compiler, et intellisense sait exactement ce que je peux avec.

Alors, comment diable sait-il quel est le type sans le using?

(Et en passant, si elle sait sans using, pourquoi avons-nous besoin using s du tout ?!)

+0

Pouvez-vous publier le code réel de votre programme dans les deux cas? Je doute que vous ayez vraiment une méthode nommée Foo et une classe nommée MyDomainObject, peut-être que le vrai code peut vous éclairer dessus. –

+0

Désolé, ne travaille pas pour moi ... il ne compile en aucun cas – tanascius

+0

Voir la réponse de Jon Skeet pour la situation que je rencontrais dans mon vrai code – RichK

Répondre

6

Votre exemple avec un constructeur ne fonctionnera pas, mais une situation légèrement plus complexe le fera. Supposons, par exemple, vous avez trois types:

  • classe Foo dans l'espace de noms N1
  • Bar classe dans l'espace de noms N2
  • classe Baz dans l'espace de noms N3

Supposons maintenant Bar a une méthode qui retourne une instance de Foo:

public static Foo GetFoo() { ... } 

ici, Bar.cs serait besoin d'une directive using pour N1, sauf si elle a spécifié le nom en entier.

Supposons maintenant que nous avons ce code dans Baz:

using N2; 
... 
var foo = Bar.GetFoo(); 

Ce compilera, mais

using N2; 
... 
Foo foo = Bar.GetFoo(); 

seront pas. La raison en est que l'utilisation des directives est seulement là pour que le compilateur sache ce que le nom "Foo" signifie - ce que son nom pleinement qualifié est. Dans le premier extrait, Bar.GetFoo() est effectivement déclaré pour renvoyer N1.Foo, donc le compilateur est correct. Dans le deuxième extrait, le compilateur voit d'abord "Foo" et ne sait rien sur N1, donc ne sait pas comment le rechercher.

+0

Merci Jon, à la fois pour la réponse et pour avoir réussi à comprendre la question posée à mes pauvres exemple – RichK

+0

+1 Explication excellente et concise –

6

Réponse courte est qu'il ne fonctionne pas.

Il doit y avoir une autre raison pour le comportement et la différence que vous voyez. Pouvez-vous reproduire le problème avec un programme court mais complet pour que vous puissiez le publier ici? Il n'y a rien de magique sur le mot-clé var, il déduit simplement le type nécessaire en fonction de l'expression sur le côté droit de l'affectation (dans ce cas), donc il n'y a aucune raison pour laquelle l'un des éléments de code devrait fonctionner mieux que l'autre.

0

Il connaît le type complet de l'objet car ce type est dans l'un des assemblys référencés. Est un raccourci permettant de dire MyType au lieu de SomeNamespace.MyType.