来自C#的深度:
并非所有lambda表达式都可以转换为表达式树。不能将带有语句块(甚至只有一条返回语句)的lambda转换为表达式树-->它必须是只计算单个表达式的形式。
由于Linq-to语句不会转换为表达式树对象,因此与Linq-to运算符一起使用的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);产出:
one two three four five six我还没有开始学习LINQ到Sql或LINQ到实体,但我假设与在IQueryable<T>上操作的LINQ语句一起使用的lambda表达式只能包含单个表达式,因为重构只能将单个表达式转换为表达式树?
谢谢
发布于 2011-12-07 18:17:04
这不仅仅是因为它们只能包含一个表达式--它根本不可能是一个语句lambda。甚至像这样的街区:
var result = query.Select(item => { return item.Length; });对于LINQ,则无效。必须将其表述为:
var result = query.Select(item => item.Length);(我刚刚注意到,这就是你引用的那部分书。哦,好吧-这表明我是一致的:)
请注意,在.NET 4中,表达式树本身确实能够包含块,但是C#编译器不能将语句lambdas转换成这种表达式树。也有其他限制,但它们很少引起问题。
这在C# 4规范的第4.6节中有具体说明:
并不是所有的匿名函数都可以表示为表达式树。例如,不能表示带有语句体的匿名函数和包含赋值表达式的匿名函数。在这些情况下,转换仍然存在,但是在编译时会失败.
。
发布于 2011-12-07 18:17:09
你是对的,它们只能包含一个表达式。
https://stackoverflow.com/questions/8420300
复制相似问题