その1

方法 : 式ツリー ビジタを実装する | Microsoft Docsにこんなコードがあったので、

protected virtual Expression VisitBinary(BinaryExpression b)
{
    Expression left       = this.Visit(b.Left);
    Expression right      = this.Visit(b.Right);
    Expression conversion = this.Visit(b.Conversion);
    if (left != b.Left || right != b.Right || conversion != b.Conversion)
    {
        if (b.NodeType == ExpressionType.Coalesce && b.Conversion != null)
        {
            return
                Expression.Coalesce(left,
                                    right,
                                    conversion as LambdaExpression);
        }
        else
        {
            return
                Expression.MakeBinary(b.NodeType,
                                      left,
                                      right,
                                      b.IsLiftedToNull,
                                      b.Method);
        }
    }

    return b;
}

プログラミング作法の「自然な形の式を使おう*1」「多分岐の判定にはelse-ifを使おう*2」の法則を使って

protected Expression VisitBinary(BinaryExpression b)
{
    Expression left  = Visit(b.Left);
    Expression right = Visit(b.Right);
    Expression conversion = Visit(b.Conversion);
    if (left       == b.Left  &&
        right      == b.Right &&
        conversion == b.Conversion)
    {
        return b;
    }
    else if (b.Conversion == null ||
             b.NodeType   != ExpressionType.Coalesce)
    {
        return
            Expression.MakeBinary(b.NodeType,
                                  left,
                                  right,
                                  b.IsLiftedToNull,
                                  b.Method);
    }
    else
    {
        return Expression.Coalesce(left,
                                   right,
                                   conversion as LambdaExpression);
    }
}

としたんですけど、合ってますかね、これ…。*3

*1:23p.「条件式に否定が含まれていると、間違いなくわかりづらくなる」

*2:34p.

*3:条件内の否定が4つから1つに減った!