Dan*_*owy 15 c# linq lambda expression-trees
我的印象是在lambda表达式中无法进行赋值.例如,以下(当然不是非常有用)代码
Expression<Action<int, int>> expr = (x, y) => y = x;
Run Code Online (Sandbox Code Playgroud)
产生编译器错误
An expression tree may not contain an assignment operator
Run Code Online (Sandbox Code Playgroud)
然而,根据Microsoft的文档,可以使用编程方式创建赋值表达式Expression.Assign.除非我弄错了,否则以下代码会产生等价Expression:
ParameterExpression xparam = Expression.Parameter(typeof(int), "x");
ParameterExpression yparam = Expression.Parameter(typeof(int), "y");
BinaryExpression body = Expression.Assign(yparam, xparam);
var expr = Expression.Lambda<Action<int, int>>(body, xparam, yparam);
var cexpr = expr.Compile();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器不会抱怨.我觉得我在这里错过了一些重要的区别.
Eri*_*ert 16
usr的回答是正确的; 在某种程度上进行扩展:
你没有错过一个重要的区别,你错过了一个重要的维度:时间.
如果仔细查看文档,您会注意到该Assign节点是在.NET 4.0中添加的.
表达式树被添加到随.NET 3.5一起提供的C#3.0中.
自.NET 3.5发布以来,拥有表达式树库的团队为其添加了许多功能.使用这些功能允许更多表达式在C#语言的表达式树中,并没有为C#4.0或C#5.0做出削减.有没有理由不这样做的功能; 这是一个非常明智的功能.但语言的设计者不需要理由不去做一个特征; 他们需要一个理由来花预算上的一个特征.
在这种情况下,C#中更丰富的表达式树只是在优先级列表上没有足够高.如果您希望该功能具有更高的优先级,那么您可以在connect.microsoft.com上打开一个问题并请求它.如果您为该功能添加了引人注目的方案,则更有可能实施您的请求.
usr*_*usr 10
你不是在误解任何事情.C#故意限制它可以为你生成的表达式树种.没有原因可以解释为什么它没有这个功能.它只是没有投入.(创建功能会占用资源.您是否愿意拥有async/await或表达树语句?显然,第一个选项更有用.).
你也不能产生其他类的语句if或while虽然他们是表达式树API中开始.NET 4(你可以构建现在编译表达式树复杂的控制流).