热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Expression/Func重载的编译器错误

如何解决《Expression/Func重载的编译器错误》经验,为你挑选了1个好方法。

截图说明了它.我有截屏中看到的重载.当使用字符串作为第二个参数时,编译器应该确定第一个参数只能是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/).
推荐阅读
author-avatar
mobiledu2502925333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有