我正在阅读有关 C#4.0中的动态对象的this文章
在该示例中,函数TryGetMember(GetMemberBinder binder,out object result)的第二个参数是Object类型。我查看MSDN并注意到其他方法也将参数作为Object。为什么这些功能不通用?
来自MSDN
关于简单的作业,装箱和拆箱都是 计算上昂贵的过程
如果拳击/拆箱费用昂贵,那么使用仿制药会不会更好?
感谢。
答案 0 :(得分:8)
请注意“与简单分配有关”。换句话说,与最便宜的操作之一相比,拳击是昂贵的。
与动态打字所涉及的其他机器相比,拳击便宜:)
如果TryGetMember
是通用的,则意味着调用者必须知道期望的类型。动态类型的一个要点是调用者无法保证将要发生的事情。如果我写:
dynamic foo = GetDynamicValueFromSomewhere();
Console.WriteLine(foo.SomeProperty);
只有在 Console.WriteLine
被评估之后,才会解决SomeProperty
过载使用的过载问题。它没有“预期的”返回类型...那么你期望使用什么泛型类型参数?
请记住,大多数动态类型方案都会使用object
作为CLR中的中间表达式类型。如果我写:
dynamic x = 10;
那是已经拳击。您不能在CLR中表示“不确定类型的未装箱值类型”。 (它会分配多少空间?)