gpt4 book ai didi

c# - LINQ Expression API 不提供创建变量的方法吗?

转载 作者:行者123 更新时间:2023-11-30 13:19:08 25 4
gpt4 key购买 nike

我想验证我的假设,即 LINQ Expression API 没有任何方法让我们创建表示创建局部变量的表达式。

换句话说,您不能创建表达式来表示:

int local;

因为那是一个变量声明语句,而且 API 不支持语句 lambda。由 LINQ 表达式 API(而不是委托(delegate)实例)表示的 lambda 表达式可以使用的唯一状态是它接收的参数和它通过闭包接收的捕获变量。

我的假设(基于几个月的 LINQ Expression API 实践)是否正确?

最佳答案

错了。 Expression.Block 有一些重载去做。

事实上,您不能通过使用具有变量的 C# 编译器来创建 lambda 表达式,但这是编译器的限制。

所以你不能

Expression<Func<int>> exp = () => {
int v = 1;
return v;
};

但你可以

var variable = Expression.Variable(typeof(int));
var lambda = Expression.Lambda<Func<int>>(
Expression.Block(
new[] { variable },
Expression.Assign(variable, Expression.Constant(1)),
variable)); // With lambda expressions, there is an implicit
// return of the last value "loaded" on the stack

since that is a variable declaration statement, and the API does not support statement lambdas.

这在 .NET < 4.0 中是正确的。在 .NET 4.0 中,Microsoft 添加了 Expression 方法来构建几乎所有可以出现在方法主体中的东西(有一些缺失的“东西”,比如不安全的代码关键字/运算符,还有原语但没有像 forlock 这样可以构建在其他结构之上的复杂结构)。请注意,其中 90% 的添加内容与 LINQ-to-SQL/EF 不兼容。

关于c# - LINQ Expression API 不提供创建变量的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com