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

Tal*_*sar 3 c# concurrency lambda

我在C#中有一个并发的字典:

private static ConcurrentDictionary<string, dynamic> cache =
        new ConcurrentDictionary<string, dynamic>();
Run Code Online (Sandbox Code Playgroud)

我正在尝试向字典添加或更新动态值

public void SetCache(string key, dynamic value)
{
       cache.AddOrUpdate(key, value, (k, v) => value);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误.代码有什么问题?这里的例子.

如果不首先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态分派的操作的参数.

Evk*_*Evk 6

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

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

cache.AddOrUpdate(key, value, (Func<string, dynamic, dynamic>) ((k, v) => value));
Run Code Online (Sandbox Code Playgroud)

这里的例子.