var
означает вывод типа static - в вашем случае он в точности эквивалентен
A a1 = new A();
Вся привязка все еще выполняется полностью статически. Если вы посмотрите на сгенерированный код, он будет точно таким же, как и в предыдущем объявлении.
dynamic
означает, что все любые выражения, использующие a2
, связаны во время выполнения, а не во время компиляции. время, поэтому он может вести себя динамически. Компилятор не проверяет, существует ли метод Foo
- его поведение определяется во время выполнения. Действительно, если объект реализует IDynamicMetaObjectProvider
, он может решить, что делать с вызовом во время выполнения, отвечая на любой вызов метода (или другой вид использования) - другими словами, там не обязательно быть "
var
безопасен по типу, так как использует вывод типа.
Запись var a = new A ();
является сокращением для A a = new A ();
.
Переменная, объявленная динамической
, НЕ является типобезопасной, и компилятор ничего не делает для проверки того, существуют ли методы, которые вы вызываете для нее.
В случае var
A () должен иметь метод .Foo (int)
во время компиляции.
динамический
случай, нет.