c# - 不能使用 lambda 表达式作为动态调度的参数

标签 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 .

Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type.

最佳答案

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

匿名 lambda 可以表示委托(delegate)(并且可以有许多匹配的委托(delegate)类型)或表达式树。在分配给特定类型的变量或在需要特定类型的上下文中使用之前,它本身没有类型。当使用常规(非动态)类型时,编译器通常可以推断出目标类型(例如 Func<string, string> )。但是,当涉及动态类型时——编译器无法做到这一点,因为所有解析现在都在运行时执行,而不是在编译时执行。所以编译器不会分配类型 Func<string, dynamic, dynamic>到你的 lambda,你应该自己做(正如编译器建议的那样):

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

Example here.

关于c# - 不能使用 lambda 表达式作为动态调度的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43890447/

相关文章:

java - 为什么 Java 使用 -> 而不是 => 来表示 lambda 函数?

c++ - 在没有捕获列表的情况下访问 lambda 中的变量

Java 使用 lambda 迭代映射器方法?

iphone - dispatch_group_wait 与 GCD

apache - 限制Apache2中的并发连接数

java - Spring JMS 监听器容器并发属性不起作用

c# - 是否可以在 C# 中使用作为关键字的值定义枚举?

c# - DataGrid 滚动查看器不工作

c# - 如何在启动时向应用程序提供参数

c# - 来自集成测试的 ASP.NET Core UseSetting