Last Updated: May 17, 2026
The params keyword used to mean one thing: "accept a variable number of arguments as an array." C# 13 lifts that restriction. A params parameter can now be any supported collection type, including ReadOnlySpan<T>, IEnumerable<T>, List<T>, and types that opt in via a collection builder. The headline benefit is performance, because params ReadOnlySpan<T> lets the compiler skip the heap allocation that params T[] always paid for.
This lesson assumes you've seen classic params T[] from the methods and arrays chapters. The focus here is what's new in C# 13, how overload resolution behaves when multiple params shapes exist side by side, and which form to reach for in real code.
Version note: params collections require C# 13 (.NET 9 SDK or later). If your project targets an older LangVersion, the compiler treats params Span<T> and params IEnumerable<T> as syntax errors. The classic params T[] still works everywhere.