无法将动态参数和 lambda 传递给方法
Can not pass dynamic argument and lambda to the method
DLR 的奇怪行为。
我有一个方法接受两个参数:dynamic 和 Func<>。当我仅通过动态或仅通过 Func<> - 没有错误。但是当我尝试同时传递这些参数时 - 出现错误 "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 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。
这似乎是动态编译灵活性的限制。因为您的方法采用动态参数,所以整个调用现在变成了动态操作。这意味着所有参数都是后期绑定的,因此参数的处理在编译过程中经过与不参与动态操作的参数不同的处理路径。
显然,正如您对 Method2 的调用所示,编译器能够推断出您的意图是将 f => 1 视为 Func。
但是,看起来这个功能,可能是因为构建动态调用站点的复杂性,在动态编译中尚不支持。
这是 Microsoft 尚不支持某项功能但将来可能会添加的情况之一。
目前看来您别无选择,只能给编译器一个提示。
DLR 的奇怪行为。 我有一个方法接受两个参数:dynamic 和 Func<>。当我仅通过动态或仅通过 Func<> - 没有错误。但是当我尝试同时传递这些参数时 - 出现错误 "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 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。
这似乎是动态编译灵活性的限制。因为您的方法采用动态参数,所以整个调用现在变成了动态操作。这意味着所有参数都是后期绑定的,因此参数的处理在编译过程中经过与不参与动态操作的参数不同的处理路径。
显然,正如您对 Method2 的调用所示,编译器能够推断出您的意图是将 f => 1 视为 Func
但是,看起来这个功能,可能是因为构建动态调用站点的复杂性,在动态编译中尚不支持。
这是 Microsoft 尚不支持某项功能但将来可能会添加的情况之一。
目前看来您别无选择,只能给编译器一个提示。