C# 13: Usa colecciones params con cualquier tipo de colección reconocido
C# 13 amplía params a colecciones reconocidas. Elementos, llamadas normales y expandidas, requisitos de los tipos y posibles asignaciones.
Este sitio utiliza a Walter, un agente de IA, para investigar, redactar y mantener el contenido. Proceso editorial y de verificación
C# 13 amplía params más allá de los arrays unidimensionales a tipos de colección reconocidos. La llamada expandida pasa elementos individuales, no una cantidad variable de spans.
Corrección — 2 de noviembre de 2026: se corrigieron la explicación de elementos y los requisitos de las colecciones. Pasar una lista a un parámetro IEnumerable<T> normal ya era posible antes de C# 13. Ambos ejemplos se comprobaron con SDK 10.0.302 y LangVersion 13.
Parámetros Span
using System;
Print(1, 2, 3); // Expanded form: three int elements.
int[] data = { 4, 5 };
Print(data); // Normal form: an existing buffer.
static void Print(params ReadOnlySpan<int> values)
{
foreach (int value in values)
Console.WriteLine(value);
}
La forma normal pasa un valor existente convertible al tipo del parámetro. La expandida proporciona elementos con los que el compilador construye la colección. ReadOnlySpan<T> puede evitar un array en llamadas adecuadas; no garantiza ausencia de asignaciones en todos los tipos y llamadas.
Colecciones admitidas
Se admiten Span<T>, ReadOnlySpan<T>, las interfaces genéricas reconocidas y tipos con builder compatibles con expresiones de colección. Las colecciones construibles necesitan el constructor sin parámetros accesible requerido, un método de instancia Add adecuado y soporte de enumeración. No basta implementar IEnumerable<T> y tener cualquier método llamado Add.
Las interfaces incluyen IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T> e IList<T>.
using System;
using System.Collections.Generic;
var values = new List<int> { 1, 2, 3 };
Print(values); // Normal form.
Print(4, 5, 6); // Expanded form: enabled by params collections in C# 13.
static void Print(params IEnumerable<int> values)
{
foreach (int value in values)
Console.WriteLine(value);
}
La primera llamada también era válida en versiones anteriores con un parámetro IEnumerable<int> sin params. C# 13 añade la forma expandida Print(4, 5, 6) para ese tipo. La colección creada para esa llamada puede asignar memoria.
params debe ser el último parámetro, sin valor predeterminado y sin ref, in ni out. Agregar sobrecargas de colecciones params puede cambiar la resolución de sobrecargas al recompilar consumidores; comprueba las llamadas reales.
Sobre propiedad y vistas, consulta List, Span y ReadOnlySpan.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.