params ReadOnlySpan in C# 13

params ReadOnlySpan in C# 13

- Matt

Bisher landete jedes Argument einer params-Methode in einem frisch allozierten Array, selbst wenn die Werte die Methode nie verlassen. Seit C# 13 darf die params-Parameterliste auch vom Typ Span<T> oder ReadOnlySpan<T> sein, und der Compiler legt die Werte dafür auf dem Stack statt auf dem Heap ab.

static int Summe(params ReadOnlySpan<int> werte)
{
    var summe = 0;
    foreach (var wert in werte) summe += wert;
    return summe;
}

Summe(1, 2, 3);

Der Haken zeigt sich erst beim Rebuild bestehenden Codes: Gibt es sowohl eine params-Array- als auch eine params-Span-Überladung, bevorzugt der Compiler jetzt die Span-Variante. Die lässt sich aber nicht in einem Expression<Func<...>> verwenden, etwa bei EF-Core-Queries, und bricht dort mit einer Fehlermeldung zu ref structs. Möglich wurde das Ganze erst dadurch, dass Collection Expressions params seit C# 12 für beliebige Sammlungstypen geöffnet haben.