Incorrect loop bound in SizeOptIListSelectIterator.ToList

Aperta Adatta ai principianti
#137,126 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@equmagg ci sta già lavorando.

Dal 7/11/2026.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
64/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
csharp
Ambito
backend

Direzione di ricerca

Trova SizeOptIListSelectIterator<TSource, TResult>.ToList() nel codice sorgente di .NET runtime e leggi l’implementazione dell’iteratore introdotta nella PR #118156. Riproduci il problema con <UseSizeOptimizedLinq>true</UseSizeOptimizedLinq> usando l’esempio di reflection fornito. Il lavoro è completato quando l’override restituisce gli elementi selezionati e il risultato corrisponde alla normale enumerazione della query; l’issue suggerisce di correggere o rimuovere questo percorso non pubblico.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

area-System.Collections untriaged
Description

SizeOptIListSelectIterator<TSource, TResult>.ToList() checks the destination list’s Count immediately after constructing it with a capacity. Since Count is zero, the loop never executes and the override returns an empty list for a nonempty source.

Admittedly, this path is non-public and functionally dead, but it hides a ticking time bomb, so would be nice to fix for good hygiene (or remove altogether)

Reproduction Steps

With true

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

IEnumerable<int> query = new[] { 1, 2, 3 }.Select(x => x * 10);

MethodInfo method = query.GetType().GetMethod(
    "ToList",
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
    ?? throw new InvalidOperationException("ToList override not found");

List<int> result = (List<int>)(method.Invoke(query, null)
    ?? throw new InvalidOperationException("ToList returned null"));

Console.WriteLine(query.GetType().Name);
Console.WriteLine($"Reflection: [{string.Join(", ", result)}]");
Console.WriteLine($"Public API: [{string.Join(", ", query.ToList())}]");
Expected behavior

printing [10, 20, 30], matching enumeration of the query

Actual behavior

prints []

Regression?

The erroneous loop was included when this iterator was introduced in #118156

Known Workarounds

No workaround is needed

Configuration

Windows 10, x64
Reproduced on .NET 10, 11 rc3 and main

Other information
List<TResult> list = new List<TResult>(_source.Count);
for (int i = 0; i < list.Count; i++)
{
    list.Add(_selector(_source[i]));
}
return list;

The constructor initializes Capacity, not Count

Lingua principale
C#
Stelle
18.4k
Fork
5.8k
Merge medio
2g 12h
PR unite (30g)
579

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di dotnet/runtime

Tutte le issue di dotnet/runtime

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.