Compartir a través de


System.Linq.AsyncEnumerable en .NET 10

.NET 10 presenta la AsyncEnumerable clase , que proporciona un conjunto completo de métodos de extensión LINQ para el IAsyncEnumerable<T> tipo . Esta clase reemplaza a la biblioteca nuGet mantenida por System.Linq.Async la comunidad, lo que puede provocar errores de compilación debido a ambigüedades.

Versión introducida

.NET 10

Comportamiento anterior

Anteriormente, la AsyncEnumerable clase del paquete mantenido por System.Linq.Async la comunidad proporcionaba compatibilidad con LINQ para IAsyncEnumerable<T>.

Nuevo comportamiento

La AsyncEnumerable clase en .NET 10 y en el System.Linq.AsyncEnumerable paquete NuGet proporciona compatibilidad con LINQ para IAsyncEnumerable<T>.

Tipo de cambio disruptivo

Este cambio puede afectar a la compatibilidad de origen.

Motivo del cambio

IAsyncEnumerable<T> es una interfaz usada habitualmente, por lo que la propia plataforma debe proporcionar compatibilidad con LINQ para el tipo. Los mantenedores de System.Linq.Async y otros miembros de la comunidad solicitaron inclusión directamente en la plataforma.

Si va a actualizar a .NET 10 y el código incluye una referencia de paquete directo a System.Linq.Async, quite esa referencia de paquete o actualice a la versión 7.0.0. En el caso de .NET 10 y una versión anterior, agregue una referencia de paquete a System.Linq.AsyncEnumerable en su lugar.

Si System.Linq.Async se consume indirectamente a través de otro paquete, evite errores de ambigüedad agregando <ExcludeAssets> metadatos con un valor de compile o all:

  • Para permitir el uso transitivo de System.Linq.Async, establezca <ExcludeAssets> en compile:

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

    Esta configuración evita el uso directo en el código, al tiempo que permite que otros paquetes sigan usando System.Linq.Async internamente.

  • Para la exclusión completa, establezca <ExcludeAssets> en all.

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

    Use esta configuración solo si no tiene ninguna dependencia que requiera System.Linq.Async en tiempo de ejecución.

La mayoría de los códigos de consumo deben ser compatibles sin cambios, pero es posible que algunos sitios de llamada necesiten actualizaciones para hacer referencia a nombres y firmas más recientes. Por ejemplo, una Select llamada como e.Select(i => i * 2) funciona igual antes y después. Sin embargo, la llamada e.SelectAwait(async (int i, CancellationToken ct) => i * 2) debe cambiarse para usar Select en lugar de SelectAwait, como en e.Select(async (int i, CancellationToken ct) => i * 2).

Para obtener el conjunto completo de métodos de extensión LINQ disponibles para IAsyncEnumerable<T>, consulte la documentación de la API System.Linq.AsyncEnumerable.

Las APIs afectadas