Partager via


System.Linq.AsyncEnumerable dans .NET 10

.NET 10 introduit la AsyncEnumerable classe, qui fournit un ensemble complet de méthodes d’extension LINQ pour le IAsyncEnumerable<T> type. Cette classe remplace la bibliothèque NuGet gérée par System.Linq.Async la communauté, ce qui peut entraîner des erreurs de compilation en raison d’ambiguïtés.

Version introduite

.NET 10

Comportement précédent

Auparavant, la AsyncEnumerable classe dans le package maintenu par la communauté System.Linq.Async fournissait le support LINQ pour IAsyncEnumerable<T>.

Nouveau comportement

La AsyncEnumerable classe dans .NET 10 et dans le System.Linq.AsyncEnumerable package NuGet fournit la prise en charge LINQ pour IAsyncEnumerable<T>.

Type de changement cassant

Cette modification peut affecter la compatibilité de la source.

Raison de la modification

IAsyncEnumerable<T> est une interface couramment utilisée, de sorte que la plateforme elle-même doit fournir la prise en charge LINQ pour le type. Les chargés de maintenance de System.Linq.Async et d’autres membres de la communauté ont demandé l’inclusion directement dans la plateforme.

Si vous effectuez une mise à niveau vers .NET 10 et que votre code inclut une référence de package directe vers System.Linq.Async, supprimez cette référence de package ou effectuez une mise à niveau vers la version 7.0.0. Pour le multi-ciblage à la fois .NET 10 et une version précédente, ajoutez une référence de package à la place de System.Linq.AsyncEnumerable.

Si System.Linq.Async est consommé indirectement via un autre package, évitez les erreurs d’ambiguïté en ajoutant des métadonnées <ExcludeAssets> avec une valeur de compile ou all:

  • Pour autoriser l’utilisation transitive de System.Linq.Async, définissez <ExcludeAssets> sur compile:

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

    Cette configuration empêche l’utilisation directe dans votre code tout en permettant à d’autres packages de continuer à utiliser System.Linq.Async en interne.

  • Pour une exclusion complète, définissez <ExcludeAssets> sur all:

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

    Utilisez cette configuration uniquement si vous n’êtes certain qu’aucune dépendance ne nécessite System.Linq.Async au moment de l’exécution.

La plupart du code consommant doit être compatible sans modification, mais certains sites d’appel peuvent avoir besoin de mises à jour pour faire référence à des noms et signatures plus récents. Par exemple, un Select appel tel que e.Select(i => i * 2) fonctionne le même avant et après. Toutefois, l’appel e.SelectAwait(async (int i, CancellationToken ct) => i * 2) doit être modifié pour utiliser Select au lieu de SelectAwait, comme dans l’exemple e.Select(async (int i, CancellationToken ct) => i * 2).

Pour obtenir l’ensemble complet des méthodes d’extension LINQ disponibles IAsyncEnumerable<T>, consultez la documentation de l’API System.Linq.AsyncEnumerable.

API affectées