var 不是数据类型,而是语法糖,也就是让编译器去判断,这个var是什么。
var x = 1;编译器视作int x = 1;
var x = "a";编译器视作string x = "a";
var x; //报错
var x = 1; x = "a"; //报错
dynamic本质上是object,但是dynamic执行后期的绑定,也就是你可以在编写代码的时候调用任意的成员,编译器都会产生相应的代码,而不管这个成员是否存在。
object只是任何对象的基类,如果你不执行一个转换,编译器不允许你调用任何这个类型的成员。
object o = new Person();
o.Name = "a"; // error
(o as Person).Name = "a"; // correct