.NET 9 Features
//Before .NET 9
public static void PrintNumbers( params int[] numbers)
{
Console.WriteLine("Numbers in Array: " + string.Join(", ", numbers));
}
public static void PrintNumbers(List numbers)
{
Console.WriteLine("Numbers in List: " + string.Join(", ", numbers));
}
// .NET 9
public static void PrintNumbersInNET9(params ReadOnlySpan numbers)
{
Console.WriteLine("Numbers in ReadOnlySpan: " + string.Join(", ", numbers.ToArray()));
}
public static void PrintNumbersInNET9(params IEnumerable numbers)
{
Console.WriteLine("Numbers in IEnumerable: " + string.Join(", ", numbers));
}
Call those methods just like below.
// Using params with a Array or List
var numbersList = new List { 6, 7, 8 };
ParamsCollection.PrintNumbers(numbersList.ToArray());
ParamsCollection.PrintNumbers(numbersList);
// Using params with ReadOnlySpan
ParamsCollection.PrintNumbersInNET9([6, 7, 8]);
// Using params with List
ParamsCollection.PrintNumbersInNET9(numbersList.Where(x => x > 6));
The aforesaid scenario where you have two method overloads: one accepting params IEnumerable<T>
and another taking params ReadOnlySpan<T>
. The method resolution works as follows:
params ReadOnlySpan<T>
overload is chosen.params ReadOnlySpan<T>
overload is also selected, since arrays can be implicitly converted to ReadOnlySpan<T>
.List<T>
is passed, the params IEnumerable<T>
overload is preferred, as List<T>
implements IEnumerable<T>
but does not have an implicit conversion to ReadOnlySpan<T>
..ToArray()
and .ToList()
inherently introduce additional resource overhead. However, the updated implementation now supports passing Span<>
and IEnumerable<>
, optimizing memory usage and enabling lazy execution. This enhancement improves efficiency while offering greater flexibility for performance-critical scenarios.