Słowo kluczowe var zostało udostępnione w C# 3.0 z kolei typ dynamic w C# 4.0.

Zmienne deklarowane jako var definiowane są niejawnie ale są to typy statyczne. Zmienne deklarowane jako dynamic są typowane dynamicznie. Możliwość ta została dodana do CLR w celu wspierania takich dynamicznych języków jak Ruby i Python.

Zmienne dynamic są sprawdzane w trakcie wykonywania programu podczas gdy var sprawdzany jest w trakcie kompilacji.


Różnice

var dynamic
dostępne od C# 3.0 dostępne od C# 4.0
statyczne typowanie – typ zmiennej deklarowanej jest określany przez kompilator w trakcie kompilowania kodu dynamiczne typowanie – typ zmiennej deklarowanej jest określany przez kompilator w trakcie wykonywania
zmienna musi być zainicjowana w trakcie deklaracji zmienna nie musi zainicjowana w trakcie deklaracji
błędy są wyłapywane w trakcie kompilacji – kompilator wie jakiego typu jest zmienna, dodatkowo posiada informacje o metodach czy właściwościach dlatego jest w stanie zwrócić błędy w trakcie kompilacji błędy są wyłapywane w trakcie wykonywania – dopiero w trakcie wykonywania kompilator uzyska informacje o rodzaju zadeklarowanej zmiennej dlatego też wszystkie ewentualne błędy będą wyłapywane w trakcie wykonywania programu
Intellisense jest dostępny dla zmiennej zdeklarowanej jako var Intellisense jest niedostępny dla zmiennej zdeklarowanej jako dynamic ponieważ jej typ zostanie poznany dopiero w trakcie wykonywania
var nie może zostać użyty jako parametr zwracany dynamic może zostać użyty jako parametr zwracany
nie możemy przypisać wartości null wartość null może zostać przypisana

Poniżej przykład kodu wyjaśniający powyższe punkty:

namespace VarVSdynamic
{
    class Program
    {
        static void Main(string[] args)
        {
            // ============= VAR =============
            // poniższa zmienna musi być zainicjowana w trakcie deklaracji
            var test;
            // poprawny zapis
            var test2 = "Witaj Drogi Użytkowniku!";
            // poniższy zapis jest poprawny
            var test3 = 32;
            // kompilator wygeneruje błąd, typ został zdefiniowany powyżej i nie może być nadpisany
            test3 = "Jestem tekstem";
            // zmienna var nie może mieć przypisanej wartości null
            var test4 = null;
            // Intellisense jest dostepny
            test2.// Intellisense wyświetla podpowiedzi
            // ============= DYNAMIC =============
            // zmienna nie musi byc zainicjowana w trakcie deklaracji
            dynamic test5;
            // wartość może zostać przypisana później
            test5 = "Jestem tekstem";
            // wartość typu dynamicznego może być zmieniania w trakcie wykonywania programu
            test5 = 2;
            // możemy przypisać wartość null
            dynamic test7 = null;
            // Intellisense jest niedostępny
            test7. // Intellisense nie wyświetla podpowiedzi       
        }
        // Możemy zwrócić typ dynamic
        static dynamic ReturnDynamic()
        {
            dynamic test = 23;
            return test;
        }
        // poniższy zapis jest niepoprawny
        static var RetrunVar()
        {
            var test = "dwa";
            return test;
        }
    }
}