[.NET 10 servicing] Backport #123295: Skip() past the end followed by Concat() still throws ArgumentOutOfRangeException on 10.0.12
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 88/100
Direzione di ricerca
Inizia in src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs su release/10.0 e confronta il metodo interessato con la sua versione del ramo main proveniente da #123295. Esegui il repro net10.0 allegato per confermare il fallimento di Concat().ToArray() e verificare che il backport produca 1 elemento senza eccezioni.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.csguards the copy withif (sourceIndex < sourceSpan.Length)(from #123295).release/10.0: the same method still readssourceSpan.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
- Lingua principale
- C#
- Stelle
- 18.3k
- Fork
- 5.6k
- Merge medio
- 2g 18h
- PR unite (30g)
- 617
Preparare l'ambiente
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di dotnet/runtime
-
area-System.Numerics.Tensors untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
dotnet/runtime#134691 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
area-System.Threading blocking-clean-ci Known Build Error untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
dotnet/runtime#134679 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
ARM64: conditional compare rejects negative immediates the emitter can already encode as `ccmn`Apertaarea-CodeGen-coreclr performance
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
dotnet/runtime#134663 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
area-System.Security untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
dotnet/runtime#134659 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
area-System.Numerics untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
dotnet/runtime#134654 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di dotnet/runtime
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
microsoft/fluentui-blazor#5364 ·
I maintainer di solito rispondono entro 1 giorno
-
.NET triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
microsoft/agent-framework#8811 ·
I maintainer di solito rispondono entro 1 giorno
-
.NET Docs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
getsentry/sentry-dotnet#5637 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
QuantConnect/Lean#9842 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
NethermindEth/nethermind#14012 ·
I maintainer di solito rispondono entro 1 giorno