System.Linq.Expressions.Expression.CanReduce 属性是什么意思?

Wat*_* v2 1 linq custom-linq-providers linq-expressions

文档及其名称暗示,可以推断对于可以进一步分解为更小的表达式的所有表达式,该属性的值CanReduce必须设置为 true,反之亦然。

但经过仔细观察,这个推论似乎并不在所有情况下都成立。以 为例LambdaExpression,它肯定是一个复合单元。但是LambdaExpression直接从Expression类派生的类不会覆盖该CanReduce属性。该类将属性Expression定义CanReduce为 virtual 并具有返回 的实现false,因此意味着 lambda 表达式不可进一步简化,但事实并非如此。

那么这个属性的真正意义是什么?

Joe*_*han 5

我在这里发布了一个更长的答案,其中包含更多详细信息:Expression.Reduce() 做什么?,但简而言之,开箱即用的 .NET 行为似乎只减少了以下场景:

  • 复合赋值例如x += 4
  • 前/后增量/减量例如x++--y
  • 成员和列表初始化例如new List<int>() { 4, 5 }new Thing() { Prop1 = 4, Prop2 = 5 }

其他一切都保持原样。我没有看到任何支持或反对将死表达式剔除作为归约操作一部分的证据(例如,在调用Reduce() 期间,空的BlockExpression 不会从表达式树中删除)。