Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[.NET 10 servicing] Backport #123295: Skip() past the end followed by Concat() still throws ArgumentOutOfRangeException on 10.0.12

Open Beginner friendly
#134,736 3 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
88/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
csharp
Domain
backend

Research direction

Start in src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs on release/10.0 and compare the affected method with its main-branch version from #123295. Run the attached net10.0 repro to confirm the Concat().ToArray() failure and verify that the backport produces 1 element without an exception.

Written by the indexing model from the issue text.

Description

area-System.Linq untriaged
Summary

Requesting a release/10.0 backport of #123295, which fixed #123284 on main on 2026-01-20. The bug is a regression in a GA LTS release (introduced by #112401 in .NET 10), the fix is a one-line bounds check, and it is still present in the current servicing release. #123284 is locked, so this is filed separately rather than as a comment there.

Still reproduces on .NET 10.0.12

Microsoft.NETCore.App 10.0.12, Windows x64, Release, net10.0 console app (two-file repro attached below):

.NET 10.0.12
array.Skip(2).ToArray()                          -> 0 element(s)
array.Take(2).Concat(array.Skip(2)).ToArray()    -> THREW ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
    at System.Linq.Enumerable.IListSkipTakeIterator`1.Fill(IList`1 source, Span`1 destination, Int32 sourceIndex)
    at System.Linq.Enumerable.IListSkipTakeIterator`1.CopyTo(TSource[] array, Int32 arrayIndex)
    at System.Linq.Enumerable.Concat2Iterator`1.ToArray()
list.Take(2).Concat(list.Skip(2)).ToArray()      -> THREW ArgumentOutOfRangeException (same stack)

Bare Skip(n).ToArray() past the end is fine; the throw is in the CopyTo/Fill path that Concat (and anything else that fills from the iterator) uses.

Branch state
  • main: src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs guards the copy with if (sourceIndex < sourceSpan.Length) (from #123295).
  • release/10.0: the same method still reads sourceSpan.Slice(sourceIndex, destination.Length).CopyTo(destination); unconditionally (line 151 as of 2026-09-27).
  • No [release/10.0] PR references #123284 or #123295.
Impact

Hit in March 2026 in a production WinForms application after moving to .NET 10. A number-format helper did parts.Take(2).Select(...).Concat(parts.Skip(2)).ToArray() over the ;-separated sections of a .NET numeric format string; every single-section format ("N2", the common case) threw from ToArray() on a code path that had been stable since .NET Framework. "Take the first N, transform them, append the rest" is ordinary LINQ, and nothing in the exception points at Skip, so it is expensive to diagnose from the call site. The workaround (Skip(Math.Min(n, source.Length))) is not something most codebases will know to reach for, and the fix already exists.

Repro
using System.Runtime.InteropServices;

Console.WriteLine(RuntimeInformation.FrameworkDescription);
string[] one = ["N2"];
try
{
    Console.WriteLine(one.Take(2).Concat(one.Skip(2)).ToArray().Length + " element(s)");
}
catch (Exception e)
{
    Console.WriteLine($"{e.GetType().Name}: {e.Message}");
}
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>

Expected: 1 element(s). Actual on 10.0.12: ArgumentOutOfRangeException: Specified argument was out of the range of valid values.

Related
  • Regression: #112401 (Improve Enumerable.Skip and Enumerable.Take performance)
  • Report: #123284
  • Fix on main: #123295
Dominant language
C#
Stars
18.3k
Forks
5.6k
Avg merge
2d 20h
Merged PRs (30d)
614

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/runtime

All issues in dotnet/runtime

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.