Partilhar 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 System.Linq.Async pela comunidade, potencialmente causando erros de compilação devido a ambiguidades.

Versão introduzida

.NET 10

Comportamento anterior

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

Novo comportamento

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

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade da fonte.

Motivo da mudança

IAsyncEnumerable<T> é uma interface comumente usada, então a própria plataforma deve fornecer suporte LINQ para o tipo. Mantenedores de System.Linq.Async e outros membros da comunidade solicitaram a inclusão diretamente na plataforma.

Se estiveres a atualizar para .NET 10 e o teu código incluir uma referência direta a System.Linq.Asyncum pacote , remove essa referência de pacote ou atualiza para a versão 7.0.0. Para realizar o multitargeting no .NET 10 e numa versão anterior, adicione uma referência de pacote a System.Linq.AsyncEnumerable.

Se System.Linq.Async for consumido indiretamente através 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 esta configuração apenas se tiver a certeza de que nenhuma dependência requer System.Linq.Async em tempo de execução.

A maioria do código utilizado deve ser compatível sem alterações, mas alguns pontos de chamada podem precisar de atualizações para fazer referência 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 de ser alterada para usar Select em vez de SelectAwait, como em e.Select(async (int i, CancellationToken ct) => i * 2).

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

APIs afetadas