System.Linq.AsyncEnumerable i .NET 10

.NET 10 introducerar AsyncEnumerable klassen, som innehåller en fullständig uppsättning LINQ-tilläggsmetoder för IAsyncEnumerable<T> typen. Den här klassen ersätter det community-underhållna System.Linq.Async NuGet-biblioteket, vilket kan orsaka kompileringsfel på grund av tvetydigheter.

Version lanserad

.NET 10

Tidigare beteende

AsyncEnumerable Tidigare tillhandahöll klassen i det gemenskaps-underhållna System.Linq.Async paketet LINQ-stöd för IAsyncEnumerable<T>.

Nytt beteende

Klassen AsyncEnumerable i .NET 10 och i System.Linq.AsyncEnumerable NuGet-paketet tillhandahåller LINQ-stöd för IAsyncEnumerable<T>.

Typ av brytande ändring

Den här ändringen kan påverka källkompatibiliteten.

Orsak till ändring

IAsyncEnumerable<T> är ett vanligt gränssnitt, så själva plattformen bör ge LINQ-stöd för typen. Underhållare av System.Linq.Async och andra gemenskapsmedlemmar ansökte om att få bli inkluderade direkt i plattformen.

Om du uppgraderar till .NET 10 och koden innehåller en direkt paketreferens till System.Linq.Asynctar du bort paketreferensen. För multitargeting av både .NET 10 och en tidigare version lägger du till en paketreferens i System.Linq.AsyncEnumerable stället.

Om System.Linq.Async används indirekt via ett annat paket kan du undvika tvetydighetsfel genom att lägga till <ExcludeAssets> metadata med värdet compile eller all:

  • Om du vill tillåta transitiv användning av System.Linq.Asyncanger du <ExcludeAssets> till compile:

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

    Den här konfigurationen förhindrar direkt användning i koden samtidigt som andra paket kan fortsätta att använda System.Linq.Async internt.

  • För fullständig exkludering anger du <ExcludeAssets> till all:

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

    Använd endast den här konfigurationen om du är säker på att inga beroenden kräver System.Linq.Async vid körning.

Den mest använda koden bör vara kompatibel utan ändringar, men vissa anropswebbplatser kan behöva uppdateringar för att referera till nyare namn och signaturer. Till exempel kommer ett anrop som Select fungera på samma sätt före och efter som e.Select(i => i * 2). Anropet e.SelectAwait(async (int i, CancellationToken ct) => i * 2) måste dock ändras för att kunna användas Select i stället för SelectAwait, som i e.Select(async (int i, CancellationToken ct) => i * 2).

Se dokumentationen för System.Linq.AsyncEnumerable API för den fullständiga uppsättningen LINQ-tilläggsmetoder som är tillgängliga för IAsyncEnumerable<T>.

Berörda API:er