我在C#中有一个并发字典:
private static ConcurrentDictionary<string, dynamic> cache =
new ConcurrentDictionary<string, dynamic>();
我试图在字典中添加或更新动态值
public void SetCache(string key, dynamic value)
{
cache.AddOrUpdate(key, value, (k, v) => value);
}
但是我收到以下错误。代码有什么问题? Example here
不能将lambda表达式用作a的参数 动态调度操作,而不先将其转换为 委托或表达式树类型。
答案 0 :(得分:5)
我认为错误信息非常清楚。
匿名lambda可以表示委托(并且可以有许多匹配的委托类型)或表达式树。在分配给特定类型的变量之前,它本身没有类型,或者在期望特定类型的上下文中使用。当使用常规(非动态)类型时,编译器通常可以推导出目标类型(例如Func<string, string>
)。当涉及动态类型时 - 编译器不能这样做,因为所有分辨率现在都在运行时执行,而不是在编译时执行。所以编译器不会将类型Func<string, dynamic, dynamic>
分配给你的lambda,你应该自己做(如编译器所示):
cache.AddOrUpdate(key, value, (Func<string, dynamic, dynamic>) ((k, v) => value));
答案 1 :(得分:0)
动态只是绕过静态类型检查。但是,您尝试将其用作代码指针,并且正如错误所示,您需要将其强制转换为委托或表达式树。在这种情况下,不会绕过静态类型检查。