public SqlRangeRegularArray(int[] lengths)
        {
            if (lengths != null && lengths.Any(l => l < 0))
            {
                throw new ArgumentException("One or many items have invalid values.", "lengths");
            }

            _array     = PwrArray.CreateAsRegular <Range?>(lengths);
            _arrayInfo = new RegularArrayInfo(lengths);
        }
        public SqlStringRegularArray(int[] lengths, Encoding encoding)
        {
            if (lengths != null && lengths.Any(t => t < 0))
            {
                throw new ArgumentException("One or many items have invalid values.", "lengths");
            }

            _array     = PwrArray.CreateAsRegular <String>(lengths);
            _arrayInfo = new RegularArrayInfo(lengths);
            _encoding  = encoding;
        }
        public static Array ReadRegularArray <T>(this BinaryReader reader, Func <BinaryReader, int, int[], T> itemReader, int[] indices, int[] lengths, int[] lowerBounds = null)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }
            if (itemReader == null)
            {
                throw new ArgumentNullException("itemReader");
            }

            Array array = PwrArray.CreateAsRegular <T>(lengths, lowerBounds);
            int   total = 0;

            try
            {
                array.FillAsRegular((fi, di) => { var v = itemReader(reader, fi, di); total = fi + 1; return(v); }, indices);
            }
            catch (Exception ex) when(ThrowDataInfo)
            {
                throw new StreamReadException(array, total, ex);
            }
            return(array);
        }