从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节中规定:
并非所有匿名函数都可以表示为表达式树.例如,无法表示包含语句主体的匿名函数和包含赋值表达式的匿名函数.在这些情况下,转换仍然存在,但在编译时将失败.