Udostępnij przez


System.Linq.AsyncEnumerable na platformie .NET 10

Platforma .NET 10 wprowadza klasę AsyncEnumerable , która udostępnia pełny zestaw metod rozszerzeń LINQ dla IAsyncEnumerable<T> typu. Ta klasa zastępuje bibliotekę NuGet utrzymywaną System.Linq.Async przez społeczność, co potencjalnie powoduje błędy kompilacji z powodu niejednoznaczności.

Wersja wprowadzona

.NET 10

Poprzednie zachowanie

Wcześniej klasa w AsyncEnumerableSystem.Linq.Async zapewniała obsługę LINQ dla programu .

Nowe zachowanie

Klasa AsyncEnumerable na platformie .NET 10 i w pakiecieSystem.Linq.AsyncEnumerable NuGet zapewnia obsługę LINQ dla programu IAsyncEnumerable<T>.

Typ zmiany przełamującej

Ta zmiana może mieć wpływ na zgodność źródła.

Przyczyna zmiany

IAsyncEnumerable<T> jest powszechnie używanym interfejsem, więc sama platforma powinna zapewnić obsługę LINQ dla typu. Osoby utrzymujące System.Linq.Async oraz inni członkowie społeczności złożyli petycję o włączenie bezpośrednio na platformie.

Jeśli uaktualniasz do platformy .NET 10, a kod zawiera bezpośrednie odwołanie do System.Linq.Asyncpakietu , usuń odwołanie do tego pakietu lub uaktualnij go do wersji 7.0.0. W przypadku wielotargetowania zarówno .NET 10, jak i poprzedniej wersji, dodaj odwołanie do pakietu System.Linq.AsyncEnumerable.

Jeśli System.Linq.Async jest używany pośrednio za pośrednictwem innego pakietu, unikaj błędów niejednoznaczności, dodając <ExcludeAssets> metadane z wartością compile lub all:

  • Aby zezwolić na przechodnie użycie elementu System.Linq.Async, ustaw wartość <ExcludeAssets> na compile:

    <PackageReference Include="System.Linq.Async" Version="6.0.1">
      <ExcludeAssets>compile</ExcludeAssets>
    </PackageReference>
    

    Ta konfiguracja uniemożliwia bezpośrednie użycie w kodzie przy jednoczesnym umożliwieniu innym pakietom dalszego korzystania z programu System.Linq.Async wewnętrznie.

  • W przypadku pełnego wykluczenia ustaw wartość <ExcludeAssets>all:

    <PackageReference Include="System.Linq.Async" Version="6.0.1">
      <ExcludeAssets>all</ExcludeAssets>
    </PackageReference>
    

    Użyj tej konfiguracji tylko wtedy, gdy nie masz pewności, że żadne zależności nie wymagają narzędzia System.Linq.Async w czasie wykonywania.

Większość korzystania z kodu powinna być zgodna bez zmian, ale niektóre witryny wywołań mogą wymagać aktualizacji, aby odwoływać się do nowszych nazw i podpisów. Na przykład, wywołanie takie jak Selecte.Select(i => i * 2) działa tak samo przed i po określonym momencie. Jednak wywołanie e.SelectAwait(async (int i, CancellationToken ct) => i * 2) musi zostać zmienione, aby używać Select zamiast SelectAwait, jak w e.Select(async (int i, CancellationToken ct) => i * 2).

Pełny zestaw dostępnych metod rozszerzenia LINQ dla IAsyncEnumerable<T> można znaleźć w dokumentacji API System.Linq.AsyncEnumerable.

Interfejsy API, których dotyczy problem