dynamic是不是没有类型的变量?
dynamic不是没有类型的变量,它在编译期有类型,就是system.object。编译器对dynamic不做静态检查,把成员访问、方法调用和运算符重载推迟到运行时由动态语言运行时(dlr)解析。声明时写dynamic,实际承载的值仍是强类型对象,只是编译器不强制你提前知道它的接口。

dynamic在编译期和运行时的行为差异是什么?
编译期dynamic被当作object处理,不会生成虚方法表查找或属性访问的IL指令;运行时DLR根据实际对象的类型缓存绑定结果并执行调用。若实际对象不支持请求的成员,会抛出RuntimeBinderException而不是编译错误。这种延迟绑定的代价是失去IDE智能提示和早期错误检测,但换来与COM、反射、JSON等动态结构的无缝交互。

using System;
using System.Dynamic;
class Program
{
static void Main()
{
dynamic d = new { Name = "Alice", Age = 30 };
Console.WriteLine(d.Name); // 输出: Alice
Console.WriteLine(d.Age); // 输出: 30
try
{
Console.WriteLine(d.Missing);
}
catch (Microsoft.CSharp.RuntimeBinderException ex)
{
Console.WriteLine(ex.Message);
}
}
}
当dynamic指向匿名对象时,缺少成员会发生什么?
当dynamic变量指向一个匿名对象时,访问存在的属性会正常返回值;访问不存在的属性会在运行时抛出RuntimeBinderException。这是因为DLR在首次绑定时会尝试通过反射或ExpandoObject机制解析成员,找不到则报错。该异常不会在编译期捕获,因此需要显式try-catch处理。此行为与var不同,var在编译期就会因成员不存在而报错。
using System;
using System.Dynamic;
class Program
{
static void Main()
{
dynamic d = new { Name = "Bob" };
Console.WriteLine(d.Name); // 输出: Bob
try
{
Console.WriteLine(d.Email);
}
catch (Microsoft.CSharp.RuntimeBinderException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}










