为什么DynamicObject类中的方法不是通用的?

时间:2011-03-15 08:04:03

标签: c# .net generics dynamic

我正在阅读有关 C#4.0中的动态对象this文章 在该示例中,函数TryGetMember(GetMemberBinder binder,out object result)的第二个参数是Object类型。我查看MSDN并注意到其他方法也将参数作为Object。为什么这些功能不通用?
来自MSDN

  

关于简单的作业,装箱和拆箱都是   计算上昂贵的过程

如果拳击/拆箱费用昂贵,那么使用仿制药会不会更好?

感谢。

1 个答案:

答案 0 :(得分:8)

请注意“与简单分配有关”。换句话说,与最便宜的操作之一相比,拳击是昂贵的。

与动态打字所涉及的其他机器相比,拳击便宜:)

如果TryGetMember是通用的,则意味着调用者必须知道期望的类型。动态类型的一个要点是调用者无法保证将要发生的事情。如果我写:

dynamic foo = GetDynamicValueFromSomewhere();
Console.WriteLine(foo.SomeProperty);

只有在 Console.WriteLine被评估之后,才会解决SomeProperty过载使用的过载问题。它没有“预期的”返回类型...那么你期望使用什么泛型类型参数?

请记住,大多数动态类型方案都会使用object作为CLR中的中间表达式类型。如果我写:

dynamic x = 10;

那是已经拳击。您不能在CLR中表示“不确定类型的未装箱值类型”。 (它会分配多少空间?)