我知道编译器可以从 lambda 表达式转换为 Predicate。
例如:
Predicate<int> p = x => true;
很好。
但是当我想创建一个包含谓词的元组时。
我试图这样做(简化版):
Tuple<Predicate<int>> t;
t = Tuple.Create(x => true);
我得到了编译错误:
我的问题是这是什么错误,这里的歧义在哪里?
(我知道我可以通过强制转换来修复它:
t = Tuple.Create((Predicate<int>)(x => true));
但我想了解为什么第一种方法不好,而且我不想进行转换以节省输入:) 最佳答案
这里的歧义是编译器不会尝试根据已经声明所需类型的左侧来推断传递给 Tuple.Create
的 lambda 表达式。发生的情况是类型推断算法开始执行(无论您声明变量的类型),并且无法找到适合您的 lambda 表达式的匹配项,因为它没有足够的信息。
这可以通过声明元组的类型并明确告诉编译器如何推断 lambda 表达式来轻松解决:
t = Tuple.Create<Predicate<int>>(x => true);
如果您想进入类型推断算法并查看它失败的原因:
鉴于:
Tr M<X1…Xn>(T1 x1 … Tm xm)
现在我们开始:
所以我们看看显式参数类型推断是做什么的:
您的匿名函数不是显式类型,因此编译器无法从参数类型 Ui..Uk 进行精确推断到
Tuple.Create
的正确重载。关于c# - 为什么我不能在 Tuple.Create 中使用 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33146225/