Inférence de type et mot-clé var
Observez le code ci-dessous. Le type indiqué au début de chaque déclaration de variable peut être déterminé automatiquement par le compilateur à partir de la valeur d’initialisation située à droite du signe égal. Par exemple, peut-il déduire que 18 est un entier int et que Phone() renvoie un objet de type Phone ?
static void Main( )
{
int age = 18; // La valeur 18 à droite est directement inférée comme int
Phone p = new Phone(); // Le constructeur à droite retourne une instance Phone
}
Langage du code : C# (cs)
Peut-on donc simplifier le code ci-dessus ?
C# propose le mot-clé var pour alléger la syntaxe et remplacer les déclarations de type explicites.
static void Main( )
{
var age = 18;
var p = new Phone();
}
Langage du code : JavaScript (javascript)
Ici, toutes les variables à gauche utilisent var. Le compilateur déduit le bon type grâce à l’expression de droite. Après compilation, les deux extraits de code sont identiques.

Remarques importantes
varn’est pas un type dynamique. Ce n’est qu’un sucre syntaxique. Le compilateur fixe le type inféré à la compilation, celui-ci ne peut plus être modifié par la suite ; les deux portions de code ont exactement le même comportement.- Règles impératives pour utiliser
var:- Il ne fonctionne que pour les variables locales, pas pour les champs d’une classe
- Il faut obligatoirement affecter une valeur initiale lors de la déclaration. Écrire seulement
var x;est invalide - Le type déduit reste figé ; on ne peut pas stocker des données d’un autre type dans la variable ensuite
- Distinction essentielle : le
varde C# ≠ levarde JavaScript. Le var de JavaScript correspond à un typage faible et dynamique, autorisant une variable à stocker n’importe quel type. Le var de C# n’est qu’un raccourci dans un langage à typage statique fort, sans changer les caractéristiques du langage.
Autrement dit, pendant la compilation, le compilateur utilise la partie droite pour déterminer que age est de type int et p de type Phone. Le résultat final correspond exactement au premier code.
On ne peut pas modifier leurs types après coup. Voici un exemple :

class Program
{
static void Main()
{
var age = 18;
age = 3.14;
var p = new Phone();
}
}
class Phone
{
public string Name { get; set; }
}Langage du code : C# (cs)
Cette notation provoque une erreur en C#, mais d’autres langages comme JavaScript ou PHP l’autorisent : ils permettent de changer le type des variables librement.
JavaScript et PHP sont des langages à typage faible et dynamique ; leurs variables ne sont pas contraintes à un type fixe.

Exemple incorrect
class Program
{
static void Main()
{
var age = 18;
age = 3.14;
var p = new Phone();
var isBuy;
}
}
class Phone
{
var price = 1000;
var model = "iPhone";
int count = 12;
}Langage du code : C# (cs)
Inférence de type