.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.