Dans le non-génériques monde, vous pourriez obtenir un comportement différent lors de l'utilisation d' var
au lieu de le taper à chaque fois qu'une conversion implicite aurait lieu, par exemple au sein d'un foreach
boucle.
Dans l'exemple ci-dessous, une conversion implicite de object
de XmlNode
a lieu (la non-générique IEnumerator
seulement l'interface de retours object
). Si vous remplacez simplement la déclaration explicite de la variable de boucle avec l' var
mot-clé, cette conversion implicite ne prend plus de place:
using System;
using System.Xml;
class Program
{
static void Foo(object o)
{
Console.WriteLine("object overload");
}
static void Foo(XmlNode node)
{
Console.WriteLine("XmlNode overload");
}
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<root><child/></root>");
foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
Foo(node);
}
foreach (var node in doc.DocumentElement.ChildNodes)
{
// oops! node is now of type object!
Foo(node);
}
}
}
Le résultat est que le code produit en fait des sorties différentes selon que vous avez utilisé var
ou un type explicite. Avec var
le Foo(object)
de surcharge sera exécutée, sinon l' Foo(XmlNode)
de surcharge sera. La sortie du programme ci-dessus est donc:
XmlNode surcharge
objet de surcharge
Notez que ce comportement est parfaitement en fonction de la spécification du langage C#. Le seul problème est qu' var
déduit d'un autre type (object
) que vous attendez et que cette inférence n'est pas évident de regarder le code.
Je n'ai pas ajouter le IL le garder court. Mais si vous voulez, vous pouvez jeter un oeil à ildasm de voir que le compilateur génère différentes instructions IL pour les deux boucles foreach.