Динамический vs var

Возможный дубликат:
В чем разница между динамическими (С# 4) и var?

В чем разница между ключевым словом dynamic и var в .NET 4.0 (VS 2010). В соответствии с MSDN определение динамического - динамический поиск позволяет вам писать вызовы метода, оператора и индексатора, свойства и обращения к полю и даже вызовы объектов, которые обходят обычную статическую привязку С# и вместо этого решают динамически.

В то время как определение для var является: неявно типизированная локальная переменная строго типизирована так же, как если бы вы объявили тип самостоятельно, но компилятор определяет тип.

Как это различается в контексте кода ниже:

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

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

Ответ 1

var означает, что статический тип выведен - в вашем случае он точно эквивалентен

A a1 = new A();

Все привязки все еще выполняются полностью статически. Если вы посмотрите на сгенерированный код, он будет точно таким же, как с приведенным выше описанием.

dynamic означает, что любое выражение с использованием a2 привязывается во время выполнения, а не во время компиляции, поэтому оно может вести себя динамически. Компилятор не проверяет, существует ли метод Foo - поведение определяется во время выполнения. Действительно, если объект реализует IDynamicMetaObjectProvider, он может решить, что делать с вызовом во время выполнения, отвечая на любой вызов метода (или другой вид использования) - другими словами, не обязательно быть "реальным", метод, называемый Foo вообще.

Если вы посмотрите на сгенерированный код в динамической ситуации, вы обнаружите всевозможные странные и замечательные вещи, связанные с сайтами и связующими.

Ответ 2

var безопасен по типу, поскольку он использует вывод типа. Запись var a = new A(); является сокращением для A a = new A();. Переменная, которая объявлена ​​ dynamic, НЕ безопасна, и компилятор ничего не делает, чтобы проверить, что методы, которые вы вызываете, существуют.

Ответ 3

В случае var A() должен иметь во время компиляции метод .Foo(int).

В случае dynamic это не так.