varé digitado estático - o compilador e o tempo de execução sabem o tipo - eles apenas economizam sua digitação ... os seguintes são 100% idênticos:
var s = "abc";
Console.WriteLine(s.Length);
e
string s = "abc";
Console.WriteLine(s.Length);
Tudo o que aconteceu foi que o compilador descobriu que sdeve ser uma string (do inicializador). Nos dois casos, ele sabe (no IL) que s.Lengthsignifica a string.Lengthpropriedade (instance) .
dynamicé um animal muito diferente; é mais parecido com object, mas com despacho dinâmico:
dynamic s = "abc";
Console.WriteLine(s.Length);
Aqui, sé digitado como dinâmico . Ele não sabe sobre string.Length, porque ele não sabe nada sobre sem tempo de compilação. Por exemplo, o seguinte também seria compilado (mas não executado):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Em tempo de execução (apenas), ele verifica a FlibbleBananaSnowballpropriedade - falha em encontrá-la e explode em uma chuva de faíscas.
Com dynamic, propriedades / métodos / operadores / etc são resolvidos em tempo de execução , com base no objeto real. Muito útil para conversar com o COM (que pode ter propriedades apenas de tempo de execução), o DLR ou outros sistemas dinâmicos, como javascript.