public PathToken NextToken()
        {
            if (!HasNext())
            {
                throw new IndexOutOfRangeException();
            }

            if (this.nextToken == null)
            {
                this.nextToken = new PathToken(path, pathIndex + 1);
            }
            return(this.nextToken);
        }
        public PathToken AsPathToken()
        {
            if (this.token != null)
            {
                return(this.token);
            }

            lock (_lock)
            {
                if (this.token != null)
                {
                    return(this.token);
                }

                if (this.nodes.Count <= 0)
                {
                    throw new InvalidOperationException("The path node is empty");
                }

                this.token = new PathToken(this, 0);
                return(this.token);
            }
        }