Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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).
Doporučená akce
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);