C# 中 dynamic 类型的深入解析
1. 动态类型概述
在 C# 里,dynamic是一种特殊类型。不过,CLR(公共语言运行时)并不把它当作一个独立类型,而是将其视为System.Object。但编译器能够识别哪些表达式是动态的,并且在处理这些表达式时,会以截然不同的方式生成代码,把许多决策推迟到运行时进行。
2. 动态类型的内部机制
- 编译器处理:当使用
dynamic作为返回类型、参数、属性或字段时,编译器会生成使用object类型的代码,并使用DynamicAttribute自定义属性进行标注。不过,CLR 不会对这个属性做任何处理,它主要是供编译器使用,用于指示编译器在生成使用该标注项的代码时,应提供动态行为。 - 局部变量的处理:
DynamicAttribute不会出现在动态局部变量上。因为只有定义局部变量的方法才能使用它,编译器在为该方法生成 IL 时,从源代码中就已经知道哪些局部变量是动态的,所以无需添加标注。只有在其他代码可能访问某个变量的情况下,才需要DynamicAttribute来告知其应被当作动态变量处理。
3. 动态类型的限制
- 类型操作限制
- <