gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:59:06 26 4
gpt4 key购买 nike

深入了解 C#:

Not all lambda expressions can be converted to expression trees. You can’t convert a lambda with a block of statements ( even just one return statement ) into an expresion tree --> it has to be in the form that just evaluates a single expression.

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

        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-To-Sql 或 Linq-To-Entities,但我假设 lambda 表达式与在 IQueryable<T> 上运行的 LINQ 语句一起使用。由于限制只能将单个表达式转换为表达式树,因此只能包含单个表达式?

谢谢

最佳答案

这不仅仅是它们只能包含单个表达式 - 它根本不能是语句 lambda。即使是这样的 block :

var result = query.Select(item => { return item.Length; });

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

var result = query.Select(item => item.Length);

(我刚刚注意到这就是您引用的书中的内容。哦,好吧 - 这表明我是一致的:)

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

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

Not all anonymous functions can be represented as expression trees. For instance, anonymous functions with statement bodies and anonymous functions containing assignment expressions cannot be represented. In these cases, a conversion still exists, but will fail at compile-time.

关于linq - 将 lambda 表达式转换为表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420300/

26 4 0
文章推荐: exception - FSharpTypeFunc.Specialize 导致 TypeLoadException
文章推荐: angularjs - 如何使用 Angular 的 Protractor 0.24 版本在