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