/// <inheritdoc />
        public CompiledExpression Compile()
        {
            var left  = LeftExpression.Compile();
            var right = RightExpression?.Compile();

            var operatorFormatterName = "op_" + Operator.OperatorType;

            return(async(contextObject, scopeData) =>
            {
                var leftValue = await left(contextObject, scopeData);

                var arguments = right != null
                                        ? new FormatterArgumentType[]
                {
                    new FormatterArgumentType(0, null, (await right(contextObject, scopeData)).Value),
                }
                                        : new FormatterArgumentType[0];
                if (Cache == null)
                {
                    Cache = leftValue.PrepareFormatterCall(
                        leftValue.Value?.GetType() ?? typeof(object),
                        operatorFormatterName,
                        arguments,
                        scopeData);
                }

                if (Cache != null /*&& !Equals(Cache.Value, default(FormatterCache))*/)
                {
                    return scopeData.ParserOptions.CreateContextObject(".",
                                                                       await scopeData.ParserOptions.Formatters.Execute(Cache, leftValue.Value, scopeData.ParserOptions, arguments),
                                                                       contextObject.Parent);
                }

                return scopeData.ParserOptions.CreateContextObject(".",
                                                                   null,
                                                                   contextObject.Parent);
            });
        }