【问题标题】:Cannot use a lambda expression as an argument to a dynamically dispatched不能将 lambda 表达式用作动态分派的参数
【发布时间】:2017-10-08 23:34:48
【问题描述】:

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

【问题讨论】:

    标签: c# lambda concurrency


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为错误信息很清楚。

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

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

      Example here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-09
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多