System.Linq.Expressions.Expression.CanReduce 属性 是什么意思?
What does System.Linq.Expressions.Expression.CanReduce property mean?
从the documentation,顾名思义,可以推断CanReduce
属性的值必须为所有可以进一步分解为的表达式设置为真较小的表达式,反之亦然。
但仔细观察后,这个推论似乎并不适用于所有情况。以 LambdaExpression
为例,它当然是一个复合单元。但是直接从 Expression
class 派生的 LambdaExpression
class 不会覆盖 CanReduce
属性。 Expression
class 将 CanReduce
属性 定义为具有 returns false
实现的虚拟,因此暗示 lambda 表达式不可进一步简化,这是不正确的。
那么这个属性的真正含义是什么?
我认为您对文档的阅读有误。 "Reducing"这里并不是分解成多个更简单的表达式,而是转化为一个使用了更多基础运算的单个表达式。例如,考虑以下 ListInitExpression
(使用类似 C# 的语法):
new List<int> { 1, new Random().Next() }
在此表达式上调用 CanReduce
将 return true
。调用 Reduce()
将 return:
{
Param_0 = new List<int>();
Param_0.Add(1);
Param_0.Add(new Random().Next());
return Param_0;
}
我不清楚 Reduce()
在 LambdaExpression
return 上应该是什么,所以对我来说它是不可简化的。
我在这里发布了一个包含更多详细信息的更长答案:What does Expression.Reduce() do?,但简而言之,开箱即用的 .NET 行为似乎只会减少以下情况:
- 复合作业,例如
x += 4
- Pre/post increment/decrement 例如
x++
、--y
- 成员和列表初始化,例如
new List<int>() { 4, 5 }
、new Thing() { Prop1 = 4, Prop2 = 5 }
其他一切保持原样。我没有看到任何支持或反对将死表达式剔除作为 reduce 操作的一部分的证据(例如,在 Reduce() 调用期间不会从表达式树中删除空的 BlockExpression)。
从the documentation,顾名思义,可以推断CanReduce
属性的值必须为所有可以进一步分解为的表达式设置为真较小的表达式,反之亦然。
但仔细观察后,这个推论似乎并不适用于所有情况。以 LambdaExpression
为例,它当然是一个复合单元。但是直接从 Expression
class 派生的 LambdaExpression
class 不会覆盖 CanReduce
属性。 Expression
class 将 CanReduce
属性 定义为具有 returns false
实现的虚拟,因此暗示 lambda 表达式不可进一步简化,这是不正确的。
那么这个属性的真正含义是什么?
我认为您对文档的阅读有误。 "Reducing"这里并不是分解成多个更简单的表达式,而是转化为一个使用了更多基础运算的单个表达式。例如,考虑以下 ListInitExpression
(使用类似 C# 的语法):
new List<int> { 1, new Random().Next() }
在此表达式上调用 CanReduce
将 return true
。调用 Reduce()
将 return:
{
Param_0 = new List<int>();
Param_0.Add(1);
Param_0.Add(new Random().Next());
return Param_0;
}
我不清楚 Reduce()
在 LambdaExpression
return 上应该是什么,所以对我来说它是不可简化的。
我在这里发布了一个包含更多详细信息的更长答案:What does Expression.Reduce() do?,但简而言之,开箱即用的 .NET 行为似乎只会减少以下情况:
- 复合作业,例如
x += 4
- Pre/post increment/decrement 例如
x++
、--y
- 成员和列表初始化,例如
new List<int>() { 4, 5 }
、new Thing() { Prop1 = 4, Prop2 = 5 }
其他一切保持原样。我没有看到任何支持或反对将死表达式剔除作为 reduce 操作的一部分的证据(例如,在 Reduce() 调用期间不会从表达式树中删除空的 BlockExpression)。