Compartilhar via


System.Linq.AsyncEnumerable no .NET 10

O .NET 10 apresenta a AsyncEnumerable classe, que fornece um conjunto completo de métodos de extensão LINQ para o IAsyncEnumerable<T> tipo. Essa classe substitui a biblioteca NuGet mantida pela System.Linq.Async comunidade, potencialmente causando erros de compilação devido a ambiguidades.

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, a AsyncEnumerable classe no pacote mantido System.Linq.Async pela comunidade forneceu suporte linq para IAsyncEnumerable<T>.

Novo comportamento

A AsyncEnumerable classe no .NET 10 e no System.Linq.AsyncEnumerable pacote NuGet fornece suporte a LINQ para IAsyncEnumerable<T>.

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade do código-fonte.

Motivo da alteração

IAsyncEnumerable<T> é uma interface comumente usada, portanto, a própria plataforma deve fornecer suporte linq para o tipo. Os mantenedores de System.Linq.Async e outros membros da comunidade pediram incluir diretamente na plataforma.

Se você estiver atualizando para o .NET 10 e seu código incluir uma referência de pacote direto ao System.Linq.Async, remova essa referência de pacote ou atualize para a versão 7.0.0. Para fazer multitargeting tanto do .NET 10 quanto de uma versão anterior, adicione uma referência de pacote em vez disso.System.Linq.AsyncEnumerable

Se System.Linq.Async for consumido indiretamente por meio de outro pacote, evite erros de ambiguidade adicionando <ExcludeAssets> metadados com um valor de compile ou all:

  • Para permitir o uso transitivo de System.Linq.Async, defina <ExcludeAssets> como compile:

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

    Essa configuração impede o uso direto em seu código, permitindo que outros pacotes continuem usando System.Linq.Async internamente.

  • Para exclusão completa, defina <ExcludeAssets> como all:

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

    Use essa configuração somente se você tiver certeza de que nenhuma dependência exigirá System.Linq.Async em runtime.

O código mais consumido deve ser compatível sem alterações, mas alguns sites de chamadas podem precisar de atualizações para se referir a nomes e assinaturas mais recentes. Por exemplo, uma Select chamada como e.Select(i => i * 2) funciona da mesma forma antes e depois. No entanto, a chamada e.SelectAwait(async (int i, CancellationToken ct) => i * 2) precisa ser alterada para ser usada Select em vez de SelectAwait, como em e.Select(async (int i, CancellationToken ct) => i * 2).

Para obter o conjunto completo de métodos de extensão LINQ disponíveis, IAsyncEnumerable<T>consulte a documentação da API System.Linq.AsyncEnumerable.

APIs afetadas