1

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

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

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

4

2 回答 2

3

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

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

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

于 2015-11-23T23:26:05.000 回答
1

我认为您正在阅读错误的文档。这里的“化简”并不是说分解成多个更简单的表达式,而是转化成一个使用更多基本操作的表达式。例如,考虑以下ListInitExpression(使用类似 C# 的语法):

new List<int> { 1, new Random().Next() }

调用CanReduce此表达式将返回true。调用Reduce()将返回:

{
    Param_0 = new List<int>();
    Param_0.Add(1);
    Param_0.Add(new Random().Next());
    return Param_0;
}

我不清楚返回时应该做什么,所以对我来说它是不可还原的Reduce()LambdaExpression

于 2015-07-19T16:00:42.317 回答