/// <summary>
        /// Skips the value (reader must be positioned on a value).
        /// </summary>
        public override void SkipValue()
        {
            if (disposed)
            {
                ThrowObjectDisposedException();
            }
            if (state != BsonReaderState.Value)
            {
                var message = string.Format("SkipValue cannot be called when State is: {0}", state);
                throw new InvalidOperationException(message);
            }

            int skip;

            switch (currentBsonType)
            {
            case BsonType.Array: skip = ReadSize() - 4; break;

            case BsonType.Binary: skip = ReadSize() + 1; break;

            case BsonType.Boolean: skip = 1; break;

            case BsonType.DateTime: skip = 8; break;

            case BsonType.Document: skip = ReadSize() - 4; break;

            case BsonType.Double: skip = 8; break;

            case BsonType.Int32: skip = 4; break;

            case BsonType.Int64: skip = 8; break;

            case BsonType.JavaScript: skip = ReadSize(); break;

            case BsonType.JavaScriptWithScope: skip = ReadSize() - 4; break;

            case BsonType.MaxKey: skip = 0; break;

            case BsonType.MinKey: skip = 0; break;

            case BsonType.Null: skip = 0; break;

            case BsonType.ObjectId: skip = 12; break;

            case BsonType.RegularExpression: buffer.SkipCString(); buffer.SkipCString(); skip = 0; break;

            case BsonType.String: skip = ReadSize(); break;

            case BsonType.Symbol: skip = ReadSize(); break;

            case BsonType.Timestamp: skip = 8; break;

            case BsonType.Undefined: skip = 0; break;

            default: throw new BsonInternalException("Unexpected BsonType");
            }
            buffer.Skip(skip);

            state = BsonReaderState.Type;
        }
        /// <summary>
        /// Skips the value (reader must be positioned on a value).
        /// </summary>
        public override void SkipValue()
        {
            if (Disposed)
            {
                ThrowObjectDisposedException();
            }
            if (State != BsonReaderState.Value)
            {
                ThrowInvalidState("SkipValue", BsonReaderState.Value);
            }

            int skip;

            switch (CurrentBsonType)
            {
            case BsonType.Array: skip = ReadSize() - 4; break;

            case BsonType.Binary: skip = ReadSize() + 1; break;

            case BsonType.Boolean: skip = 1; break;

            case BsonType.DateTime: skip = 8; break;

            case BsonType.Document: skip = ReadSize() - 4; break;

            case BsonType.Double: skip = 8; break;

            case BsonType.Int32: skip = 4; break;

            case BsonType.Int64: skip = 8; break;

            case BsonType.JavaScript: skip = ReadSize(); break;

            case BsonType.JavaScriptWithScope: skip = ReadSize() - 4; break;

            case BsonType.MaxKey: skip = 0; break;

            case BsonType.MinKey: skip = 0; break;

            case BsonType.Null: skip = 0; break;

            case BsonType.ObjectId: skip = 12; break;

            case BsonType.RegularExpression: _buffer.SkipCString(); _buffer.SkipCString(); skip = 0; break;

            case BsonType.String: skip = ReadSize(); break;

            case BsonType.Symbol: skip = ReadSize(); break;

            case BsonType.Timestamp: skip = 8; break;

            case BsonType.Undefined: skip = 0; break;

            default: throw new BsonInternalException("Unexpected BsonType.");
            }
            _buffer.Skip(skip);

            State = BsonReaderState.Type;
        }