gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:11:28 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com