【发布时间】:2015-06-27 14:17:47
【问题描述】:
DLR 的奇怪行为。 我有一个方法接受两个参数:动态和 Func。当我只通过动态或仅 Func - 没有错误。但是当我尝试同时传递这些参数时 - 出现错误“不能使用 lambda 表达式作为动态调度操作的参数,而无需先将其转换为委托或表达式树类型。”:
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 的类型,为什么需要强制转换?
【问题讨论】:
-
不是答案,而是关于这个话题的小研究weblogs.asp.net/davidfowler/dynamic-linq-a-little-more-dynamic
-
如果它不舒服你可以输入
Method3((int) d, f => 1);。它有效。我删除了我的答案,因为我也很困惑!关于你所说的。但如果我发现真正发生的事情,我会让你知道。你怎么知道f => 1的类型直到你或方法参数指定才知道。