作者:mobiledu2502925333 | 来源:互联网 | 2023-05-27 11:32
截图说明了它.我有截屏中看到的重载.当使用字符串作为第二个参数时,编译器应该确定第一个参数只能是Func而不是表达式.但是编译器抛出一个错误,说"带有语句体的lamda表达式无法转换为表达式树".
为什么编译器无法找出正确的重载?
明确的演员没有帮助.什么工作是当我创建一个类型为Func的局部变量,然后使用它.
使用的框架是FakeItEasy 1.24.0
编辑:
以下是显示行为的代码:
public static void Main(string[] args)
{
//compiler error
A.CallTo(() => Main(A.That.Matches(strings =>
{
return true;
}, "description")));
//compiles
Func predicate = strings =>
{
return true;
};
A.CallTo(() => Main(A.That.Matches(predicate, "description")));
Console.ReadLine();
}
Rawling..
6
这个问题不在电话会议中Matches
.这是在呼吁CallTo
,期望一个Expression
.
显然,Expression
不仅不能是带有语句体的lambda表达式,它也不能包含带有语句体的lambda表达式.
(我不确定你的"将lambda放在局部变量中"解决方案是否有效,或者是否只是欺骗编译器并且在运行时会失败.)
这是我放在一起的测试:
static void Overloaded(Action a, string param) { }
static void Overloaded(Expression e) { }
static void CallToAction(Action a) { }
static void CallToExprAc(Expression a) { }
static void Main(string[] args)
{
// Works
CallToAction(() => Overloaded(() => { int i = 5; }, "hi"));
// Doesn't work - using the Expression overload
CallToAction(() => Overloaded(() => { int i = 5; }));
// Doesn't work - wrapped in an outer Expression
CallToExprAc(() => Overloaded(() => { int i = 5; }, "hi"));
}
你的"把表达身体的lambda放在一个地方"是否有效取决于FakeItEasy的实施方式.我怀疑它在这里可以工作,但是类似LINQ-to-SQL的东西不会 - 它只是在运行时而不是在编译时失败.
我不确定这是编译器错误,规范错误还是理想的行为.在C#规范的6.5节中我们有
某些lambda表达式无法转换为表达式树类型:即使转换存在,它也会在编译时失败.如果lambda表达式是这种情况:
•有块体
•包含简单或复合赋值运算符
•包含动态绑定表达式
•是异步
它没有说"包含一个无法转换为表达式树类型的lambda表达式".
1> Rawling..:
这个问题不在电话会议中Matches
.这是在呼吁CallTo
,期望一个Expression
.
显然,Expression
不仅不能是带有语句体的lambda表达式,它也不能包含带有语句体的lambda表达式.
(我不确定你的"将lambda放在局部变量中"解决方案是否有效,或者是否只是欺骗编译器并且在运行时会失败.)
这是我放在一起的测试:
static void Overloaded(Action a, string param) { }
static void Overloaded(Expression e) { }
static void CallToAction(Action a) { }
static void CallToExprAc(Expression a) { }
static void Main(string[] args)
{
// Works
CallToAction(() => Overloaded(() => { int i = 5; }, "hi"));
// Doesn't work - using the Expression overload
CallToAction(() => Overloaded(() => { int i = 5; }));
// Doesn't work - wrapped in an outer Expression
CallToExprAc(() => Overloaded(() => { int i = 5; }, "hi"));
}
你的"把表达身体的lambda放在一个地方"是否有效取决于FakeItEasy的实施方式.我怀疑它在这里可以工作,但是类似LINQ-to-SQL的东西不会 - 它只是在运行时而不是在编译时失败.
我不确定这是编译器错误,规范错误还是理想的行为.在C#规范的6.5节中我们有
某些lambda表达式无法转换为表达式树类型:即使转换存在,它也会在编译时失败.如果lambda表达式是这种情况:
•有块体
•包含简单或复合赋值运算符
•包含动态绑定表达式
•是异步
它没有说"包含一个无法转换为表达式树类型的lambda表达式".
由于我认为这是一个编译器错误,我已经提到了[这里](https://connect.microsoft.com/VisualStudio/feedback/details/1085342/).