不能将lambda表达式用作动态调度的参数

时间:2017-05-10 10:56:01

标签: c# lambda concurrency

我在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的参数   动态调度操作,而不先将其转换为   委托或表达式树类型。

2 个答案:

答案 0 :(得分:5)

我认为错误信息非常清楚。

匿名lambda可以表示委托(并且可以有许多匹配的委托类型)或表达式树。在分配给特定类型的变量之前,它本身没有类型,或者在期望特定类型的上下文中使用。当使用常规(非动态)类型时,编译器通常可以推导出目标类型(例如Func<string, string>)。当涉及动态类型时 - 编译器不能这样做,因为所有分辨率现在都在运行时执行,而不是在编译时执行。所以编译器不会将类型Func<string, dynamic, dynamic>分配给你的lambda,你应该自己做(如编译器所示):

cache.AddOrUpdate(key, value, (Func<string, dynamic, dynamic>) ((k, v) => value));

Example here.

答案 1 :(得分:0)

动态只是绕过静态类型检查。但是,您尝试将其用作代码指针,并且正如错误所示,您需要将其强制转换为委托或表达式树。在这种情况下,不会绕过静态类型检查。