namespace System.Runtime.CompilerServices { internal static class RuntimeHelpers { /// /// Slices the specified array using the specified range. /// public static T[] GetSubArray(T[] array, Range range) { if (array == null) { throw new ArgumentNullException(nameof(array)); } (int offset, int length) = range.GetOffsetAndLength(array.Length); if (default(T) != null || typeof(T[]) == array.GetType()) { // We know the type of the array to be exactly T[]. if (length == 0) { return Array.Empty(); } var dest = new T[length]; Array.Copy(array, offset, dest, 0, length); return dest; } else { // The array is actually a U[] where U:T. var dest = (T[])Array.CreateInstance(array.GetType().GetElementType(), length); Array.Copy(array, offset, dest, 0, length); return dest; } } } }