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

Asp*_*Net 8 linq lambda

从C#深入:

并非所有lambda表达式都可以转换为表达式树.您不能将带有语句块的lambda(甚至只是一个return语句)转换为表达式树 - >它必须采用仅评估单个表达式的形式.

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

        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);
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

one two three four five six
Run Code Online (Sandbox Code Playgroud)

我还没有开始学习Linq-To-Sql或Linq-To-Entities,但我认为用于LINQ语句的lambda表达式IQueryable<T>只能包含一个表达式,因为只有一个表达式可以被转换进入表达树?

谢谢

Jon*_*eet 15

它不仅仅是它们只能包含一个表达式 - 它根本不能是一个语句lambda.即使像这样的块:

var result = query.Select(item => { return item.Length; });
Run Code Online (Sandbox Code Playgroud)

对LINQ to SQL无效.它必须表达为:

var result = query.Select(item => item.Length);
Run Code Online (Sandbox Code Playgroud)

(我刚才注意到这就是你引用的那本书.哦,好吧 - 它表明我是一致的:)

请注意,从.NET 4开始,表达式树本身确实能够包含块,但C#编译器无法将语句lambdas转换为这种表达式树.还有其他限制,但它们很少会引起问题.

这在C#4规范的4.6节中规定:

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

  • 现在,*你*知道**C#Depth**中提到的东西到底是什么?哦,没关系. (5认同)