dynamic vs var en C #

Duplication possible:
Quelle est la différence entre dynamic (C # 4) et var?

Quelle est la différence entre le mot clé dynamic et le mot clé var dans .NET 4.0 (VS 2010). Selon MSDN, la définition dynamic est la suivante: – La recherche dynamic vous permet d’écrire des appels de méthode, d’opérateur et d’indexeur, des access aux propriétés et aux champs et même des invocations d’objects qui contournent la liaison statique normale de C # .

Alors que la définition de var est – Une variable locale implicitement typée est fortement typée comme si vous aviez déclaré le type vous-même, mais le compilateur en détermine le type .

En quoi est-ce différent dans le contexte du code ci-dessous:

var a1 = new A(); a1.Foo(1); dynamic a2 = new A(); a2.Foo(1); 

var signifie que le type statique est inféré – dans votre cas, il est exactement équivalent à

 A a1 = new A(); 

Toute la reliure se fait encore de manière statique. Si vous regardez le code généré, ce sera exactement comme avec la déclaration ci-dessus.

dynamic signifie que toute expression utilisant a2 est liée au moment de l’exécution plutôt qu’à la compilation, elle peut donc se comporter de manière dynamic. Le compilateur ne vérifie pas si la méthode Foo existe – le comportement est déterminé au moment de l’exécution. En effet, si l’object implémente IDynamicMetaObjectProvider il pourrait décider quoi faire de l’appel au moment de l’exécution, en répondant à n’importe quel appel de méthode (ou autre type d’utilisation). Foo du tout.

Si vous regardez le code généré dans la situation dynamic, vous trouverez toutes sortes de choses étranges et merveilleuses en relation avec les sites d’appel et les classeurs.

var est de type sécurisé, en ce sens qu’il utilise l’inférence de type. Écrire var a = new A(); est un raccourci pour A a = new A(); . Une variable qui est déclarée dynamic n’est PAS de type sécurisé et le compilateur ne fait rien pour vérifier que les méthodes auxquelles vous faites appel existent.

Dans le cas var , A () doit avoir une .Foo(int) lors de la compilation.

Dans le cas dynamic , ce n’est pas le cas.