什么是dynamic类型?
微软给出的官方文档中这样解释:在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查。 改为在运行时解析这些操作。 dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。在大多数情况下,dynamic 类型与 object 类型的行为类似。 但是,如果操作包含 dynamic 类型的表达式,那么不会通过编译器对该操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,之后这些信息会用于在运行时评估操作。 在此过程中,dynamic类型的变量会编译为 object 类型的变量。 因此,dynamic 类型只在编译时存在,在运行时则不存在。
dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。
下例中生成的类型是一致的:
dynamic dyn = "Fode"; Object obj = "Fode";
// Rest the mouse pointer over dyn and obj to see their
// types at compile time.
System.Console.WriteLine(dyn.GetType());
System.Console.WriteLine(obj.GetType());
其输出结果都是String类型,可知CLR可以正确的识别出dynamic是哪种类型,在反编译看看其生成的IL代码:
IL_0000: nop
IL_0001: ldstr "Fode"
IL_0006: stloc.0
IL_0007: ldstr "Fode"
IL_000c: stloc.1
IL_000d: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_0012: pop
IL_0013: ret
JIT编译器将dynamic识别为String类型,并将其推算到运算栈中(IL代码中 ldstr(将新对象引用推送到存储在元数据中的字符串文字)、(stloc.*)从评估堆栈的顶部弹出当前值,并将其存储在索引*处的本地变量列表中),不同IL代码也不所谓,前文只是介绍dynamic这个类型关键字,只需要你知道他的类型是绕过编译器就可以,如以下操作,Object类型就会报编译的错误。但是,对于 dyn + 3,不会报告任何错误。 在编译时不会检查包含 dyn 的表达式,原因是 dyn 的类型为 dynamic。










