首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将lambda表达式转换为表达式树

将lambda表达式转换为表达式树
EN

Stack Overflow用户
提问于 2011-12-07 18:10:49
回答 2查看 16.1K关注 0票数 8

来自C#的深度:

并非所有lambda表达式都可以转换为表达式树。不能将带有语句块(甚至只有一条返回语句)的lambda转换为表达式树-->它必须是只计算单个表达式的形式。

由于Linq-to语句不会转换为表达式树对象,因此与Linq-to运算符一起使用的lambda表达式可以包含一组语句。

代码语言:javascript
复制
        string[] count = { "one ", "two ", "three ", "four ", "five ", "six " };
        IEnumerable<int> result = count.Select(item =>
                               {
                                   Console.WriteLine(item);
                                   return item.Length;
                               });
        foreach (int i in result);

产出:

代码语言:javascript
复制
one two three four five six

我还没有开始学习LINQ到Sql或LINQ到实体,但我假设与在IQueryable<T>上操作的LINQ语句一起使用的lambda表达式只能包含单个表达式,因为重构只能将单个表达式转换为表达式树?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-07 18:17:04

这不仅仅是因为它们只能包含一个表达式--它根本不可能是一个语句lambda。甚至像这样的街区:

代码语言:javascript
复制
var result = query.Select(item => { return item.Length; });

对于LINQ,则无效。必须将其表述为:

代码语言:javascript
复制
var result = query.Select(item => item.Length);

(我刚刚注意到,这就是你引用的那部分书。哦,好吧-这表明我是一致的:)

请注意,在.NET 4中,表达式树本身确实能够包含块,但是C#编译器不能将语句lambdas转换成这种表达式树。也有其他限制,但它们很少引起问题。

这在C# 4规范的第4.6节中有具体说明:

并不是所有的匿名函数都可以表示为表达式树。例如,不能表示带有语句体的匿名函数和包含赋值表达式的匿名函数。在这些情况下,转换仍然存在,但是在编译时会失败.

票数 18
EN

Stack Overflow用户

发布于 2011-12-07 18:17:09

你是对的,它们只能包含一个表达式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8420300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档