protected override Linq.Expression VisitBinary(Linq.BinaryExpression node)
        {
            if (node.NodeType == Linq.ExpressionType.ArrayIndex)
            {
                _ = new ArrayIndex(this.Current)
                {
                    Array = this.VisitCacheParse(node.Left),
                    Index = this.VisitCacheParse(node.Right),
                };
            }
            else
            {
                Binary binary;

                if (node.IsReferenceComparison())
                {
                    if (node.NodeType == Linq.ExpressionType.Equal)
                    {
                        binary = new ReferenceEqual(this.Current);
                    }
                    else
                    {
                        binary = new ReferenceNotEqual(this.Current);
                    }
                }
                else
                {
                    binary = Binary.Create(this.Current, node.NodeType);

                    if (node.Method is MethodInfo method)
                    {
                        binary.Method = this.VisitMethod(method);
                    }

                    if (node.Conversion is LambdaExpression lambda)
                    {
                        binary.Conversion = new Lambda(this.VisitCache(lambda));
                    }

                    if (node.IsLiftedToNull)
                    {
                        binary.LiftToNull = true;
                    }
                }

                binary.Left  = this.VisitCacheParse(node.Left);
                binary.Right = this.VisitCacheParse(node.Right);
            }

            return(node);
        }