static TResult[] ToArray <TEnumerable, TEnumerator, TSource, TResult>(this TEnumerable source, NullableSelectorAt <TSource, TResult> selector)
            where TEnumerable : notnull, IValueReadOnlyCollection <TSource, TEnumerator>
            where TEnumerator : struct, IEnumerator <TSource>
        {
            var array = new TResult[source.Count];

            ValueReadOnlyCollectionExtensions.Copy <TEnumerable, TEnumerator, TSource, TResult>(source, array, selector);
            return(array);
        }
        static IMemoryOwner <TResult> ToArray <TEnumerable, TEnumerator, TSource, TResult>(this TEnumerable source, NullableSelectorAt <TSource, TResult> selector, MemoryPool <TResult> pool)
            where TEnumerable : notnull, IValueReadOnlyCollection <TSource, TEnumerator>
            where TEnumerator : struct, IEnumerator <TSource>
        {
            Debug.Assert(pool is object);

            var result = pool.RentSliced(source.Count);

            ValueReadOnlyCollectionExtensions.Copy <TEnumerable, TEnumerator, TSource, TResult>(source, result.Memory.Span, selector);
            return(result);
        }
        public static TSource[] ToArray <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : notnull, IValueReadOnlyCollection <TSource, TEnumerator>
            where TEnumerator : struct, IEnumerator <TSource>
        {
#if NET5_0
            var result = GC.AllocateUninitializedArray <TSource>(source.Count);
#else
            var result = new TSource[source.Count];
#endif
            ValueReadOnlyCollectionExtensions.Copy <TEnumerable, TEnumerator, TSource>(source, result);
            return(result);
        }