我的印象是,在lambda表达式中无法进行赋值。例如,以下(公认不是很有用)代码

Expression<Action<int, int>> expr = (x, y) => y = x;

产生编译器错误
An expression tree may not contain an assignment operator

然而,根据Microsoft's documentation,可以使用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();

在这种情况下,编译器不会抱怨。我觉得我在这里缺少一些重要的区别。

最佳答案

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上打开一个问题并提出要求。如果您包括一项令人信服的功能,那么您的请求更有可能实现。

关于c# - ExpressionType.Assign的故事是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16846503/

10-17 02:34