Incorrect loop bound in SizeOptIListSelectIterator.ToList

Abierto Apto para principiantes
#137,126 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@equmagg ya está trabajando en esto.

Desde el 7/11/2026.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
64/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
csharp
Área
backend

Línea de trabajo

Busca SizeOptIListSelectIterator<TSource, TResult>.ToList() en el código fuente de .NET runtime y lee la implementación del iterador introducida en el PR #118156. Reproduce el problema con <UseSizeOptimizedLinq>true</UseSizeOptimizedLinq> usando el ejemplo de reflexión proporcionado. Se considera terminado cuando el override devuelve los elementos seleccionados y el resultado coincide con la enumeración normal de la consulta; el issue sugiere corregir o eliminar esta ruta no pública.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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

Lenguaje dominante
C#
Estrellas
18.4k
Forks
5.8k
Merge medio
2 d 12 h
PR fusionados (30 d)
579

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de dotnet/runtime

Todos los issues de dotnet/runtime

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.