c# - 无法将动态参数和 lambda 传递给方法

标签 c# dynamic lambda

DLR 的奇怪行为。 我有一个方法接受两个参数:dynamic 和 Func<>。当我仅通过动态或仅通过 Func<> - 没有错误。但是当我尝试同时传递这些参数时 - 出现错误“不能将 lambda 表达式用作动态调度操作的参数,而无需先将其转换为委托(delegate)或表达式树类型。”:

    static void Main(string[] args)
    {
        dynamic d = 1;

        Method1(d);// - OK
        Method2(f => 1);// - OK
        Method3(d, f => 1);// - Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type.
    }

    static void Method1(dynamic d)
    {
    }

    static void Method2(Func<string, int> func)
    {
    }

    static void Method3(dynamic d, Func<string, int> func)
    {
    }

为什么会这样?

当然我可以进行显式转换,然后错误消失:

Method3(d, (Func<string, int>)(f => 1));

但是很不舒服。编译器知道 lambda 的类型,为什么需要转换?

最佳答案

已完成一些研究并通读了编译器为您的每个案例生成的一些 IL。

这似乎是动态编译灵 active 的限制。因为您的方法采用动态参数,所以整个调用现在变成了动态操作。这意味着所有参数都是后期绑定(bind)的,因此在编译期间对参数的处理与不参与动态操作的参数的处理路径不同。

显然,正如您对 Method2 的调用所示,编译器能够推断出您的意图是将 f => 1 视为 Func

但是,看起来这个功能,可能是因为构建动态调用站点的复杂性,在动态编译中尚不支持。

这是 Microsoft 尚不支持某项功能但将来可能会添加的情况之一。

现在看来您别无选择,只能给编译器一个提示。

关于c# - 无法将动态参数和 lambda 传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089721/

相关文章:

c# - SQL Server Express 的连接字符串

c# - .NET Core 1.1 中的 FileStream/StreamWriter 没有 Close() 方法

c++ - 指向派生类的基指针

variables - 为什么会这样(或如何)?

scala - 为什么我不能将案例类的构造函数用作在 map() 内部使用的函数

python - 首先对最长项目的列表进行排序

c++ - Visual C++ 编译和生成巨大目标文件的嵌套 lambda 表达式非常慢

c# - 如何在 ASP .NET Core 中初始化主机之前读取配置设置?

jQuery - 如何动态创建提交输入点击

javascript - C# MVC5 ValidationMessageFor使用jquery datetimepicker抛出 "The field must be a date."