热门标签 | 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/).
推荐阅读
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
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社区 版权所有