Finding Reducible Expressions

Published by

Today I just wanted to share a quick note regarding a Stack Overflow answer that I recently came across. In the answer the author explains that a call to Expression.CanReduce will typically return false, while Expression.Reduce() will return the current expression. The author continues to state that one of the types that overrides Expression.Reduce() and Expression.CanReduce is MemberInitExpression.

I wanted to find out when Expression.CanReduce would actually return true. I discovered the 173 page Expression Tree Specification which provides an additional insight to CanReduce and Reduce().

CanReduce

This property returns whether the Reduce method returns a different but semantically equivalent ET. By default, this property returns false.

In the typical case, the resulting ET contains all common ET nodes suitable for passing to any common compilation or ET processing code. Sometimes the result is only partially reduced, and when walking the resulting ET, you’ll need to further reduce some nodes.

The value returned by this property should never change for a given object.

Signature:

public virtual Boolean CanReduce { get; }

Reduce

This method returns a semantically equivalent ET representing the same expression. By default, this method returns the object on which it was invoked.

Typically the result comprises only common ET types, ET nodes suitable for passing to any compilation or ET processing code. Usually the result is only partially reduced (that is, only the root node). You’ll probably need to further reduce some nodes.

Signature:

public virtual Expression Reduce();

Reducible Types Inside System.Linq.Expressions

Using Telerik’s JustDecompile, I went through each public class to see which had an override on either CanReduce or Reduce(). The result came up with the following list:

Furthermore, I searched for descendant types of the list above and found the following reducible classes that were marked as internal, as such I couldn’t find any official documentation for them:

  • AssignBinaryExpression
  • CoalesceConversionBinaryExpression
  • LogicalBinaryExpression
  • SimpleBinaryExpression

Further Reading

Inside the expression tree specification, I would also be inclined to read section 2.2 entitled Reducible Nodes.

If there are any additional expressions that can be reduced that I have missed, please send me a message and I will add it to the list.