Sdílet prostřednictvím


Rozlišení přetížení v C# 14 s parametry typu span

C# 14, která je součástí .NET 10, zavádí nové integrované převody rozsahu a pravidla odvozování typů. Tyto změny umožňují přetížení s parametry typu span použít ve více scénářích.

Předchozí chování

V jazyce C# 13 a starší nebyla metoda rozšíření používající ReadOnlySpan<T> nebo Span<T> příjemce použitelná na hodnotu typu T[]. Z toho důvodu byly uvnitř výrazových lambda obvykle vázány pouze metody rozšíření nesouvisející s rozšiřováním span, jako jsou ty z třídy System.Linq.Enumerable.

Nové chování

V jazyce C# 14 a novějších můžou metody s parametry ReadOnlySpan<T> nebo Span<T> účastnit odvozování typů nebo je použít jako rozšiřující metody v dalších scénářích. Díky tomu mohou být metody založené na rozpětí, jako jsou ty z třídy System.MemoryExtensions, využívány ve více scénářích, včetně výrazů lambda, kde způsobují výjimky za běhu, když jsou zkompilovány s interpretací.

Zavedená verze

.NET 10

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Funkce jazyka C# umožňuje zjednodušený návrh a použití rozhraní API (například jedna metoda rozšíření ReadOnlySpan<T> může platit pro rozsahy i pole).

Pokud potřebujete pokračovat v používání interpretace výrazu, ujistěte se, že ne-spanové přetížení jsou správně svázána, například přetypováním argumentů na přesné typy, které podpis metody vyžaduje, nebo voláním rozšiřujících metod jako explicitních statických volání:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

M((array, num) => array.Contains(num)); // fails, binds to MemoryExtensions.Contains
M((array, num) => ((IEnumerable<int>)array).Contains(num)); // ok, binds to Enumerable.Contains
M((array, num) => array.AsEnumerable().Contains(num)); // ok, binds to Enumerable.Contains
M((array, num) => Enumerable.Contains(array, num)); // ok, binds to Enumerable.Contains

void M(Expression<Func<int[], int, bool>> e) => e.Compile(preferInterpretation: true);

Ovlivněná rozhraní API