/// <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: _bsonStream.SkipCString(); _bsonStream.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.");
            }
            _bsonStream.Seek(skip, SeekOrigin.Current);

            State = BsonReaderState.Type;
        }