Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
System.Linq.Expressions.Expression.CanReduce属性是什么意思?_Linq_Linq Expressions_Custom Linq Providers - Fatal编程技术网

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

System.Linq.Expressions.Expression.CanReduce属性是什么意思?,linq,linq-expressions,custom-linq-providers,Linq,Linq Expressions,Custom Linq Providers,从中可以推断,CanReduce属性的值对于所有可以进一步分解为较小表达式的表达式都必须设置为true,反之亦然 但仔细观察,这一推论似乎并非在所有情况下都成立。以LambdaExpression为例,它当然是一个复合单元。但是直接从Expression类派生的LambdaExpression类不会覆盖CanReduce属性。Expression类将CanReduce属性定义为virtual,其实现返回false,因此意味着lambda表达式不可进一步简化,这是不正确的 那么,这个属性的真正含义

从中可以推断,
CanReduce
属性的值对于所有可以进一步分解为较小表达式的表达式都必须设置为true,反之亦然

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


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

我认为您读错了文档。这里的“减少”并不意味着分解为多个更简单的表达式,而是意味着转换为使用更基本操作的单个表达式。例如,考虑下面的<代码> ListIntExpE/<代码>(使用C类语法):


我不清楚在
LambdaExpression
上应该返回什么
Reduce()
,因此我认为它是不可还原的。

我认为您阅读的文档是错误的。这里的“减少”并不意味着分解为多个更简单的表达式,而是意味着转换为使用更基本操作的单个表达式。例如,考虑下面的<代码> ListIntExpE/<代码>(使用C类语法):


对于
LambdaExpression
返回的
Reduce()
,我不清楚应该返回什么,因此它不可还原对我来说是有意义的。

我在这里发布了一个较长的答案,并提供了更多的细节:,但简而言之,开箱即用的.NET行为似乎只减少了以下情况:

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

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

我在这里发布了一个较长的答案,并提供了更多详细信息:,但简而言之,开箱即用的.NET行为似乎只会减少以下情况:

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

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

例如,复合赋值
a+=b
可以减少为
a=a+b
。很好。非常感谢。是否仅限于这些运算符(我忘记了它们的名称)?我没有深入研究
System.Linq.Expressions
,我想说的是这是真的还是假的。不过,非常感谢。我想我在这里发现了一些在这种情况下可能有用的东西:可能的重复(我知道,你问的是
CanReduce
,而不是
Reduce
。但是如果你了解后者的作用,你将离了解前者更近一大步。)例如,复合赋值
a+=b
可以减少为
a=a+b
。很好。非常感谢。是否仅限于这些运算符(我忘记了它们的名称)?我没有深入研究
System.Linq.Expressions
,我想说的是这是真的还是假的。不过,非常感谢。我想我在这里发现了一些在这种情况下可能有用的东西:可能的重复(我知道,你问的是
CanReduce
,而不是
Reduce
。但是如果你了解后者的作用,你将离了解前者更近一大步。)美丽、实用、有用,你的回答方式。谢谢。漂亮、实用、有用,你回答的方式。非常感谢。
new List<int> { 1, new Random().Next() }
{
    Param_0 = new List<int>();
    Param_0.Add(1);
    Param_0.Add(new Random().Next());
    return Param_0;
}