Поделиться через


System.Linq.AsyncEnumerable в .NET 10

В .NET 10 представлен AsyncEnumerable класс, который предоставляет полный набор методов расширения LINQ для IAsyncEnumerable<T> типа. Этот класс заменяет поддерживаемую System.Linq.Async сообществом библиотеку NuGet, что потенциально приводит к ошибкам компиляции из-за неоднозначности.

Представленная версия

.NET 10

Предыдущее поведение

AsyncEnumerable Ранее класс в поддерживаемом System.Linq.Async сообществом пакете предоставил LINQ поддержкуIAsyncEnumerable<T>.

Новое поведение

Класс AsyncEnumerable в .NET 10 и в пакетеSystem.Linq.AsyncEnumerable NuGet предоставляет LINQ поддержкуIAsyncEnumerable<T>.

Тип разрушающего изменения

Это изменение может повлиять на совместимость источников.

Причина изменения

IAsyncEnumerable<T> — это часто используемый интерфейс, поэтому сама платформа должна предоставлять LINQ поддержку типа. Поддерживающие и другие члены System.Linq.Async сообщества подали петиции за включение непосредственно на платформу.

Если вы обновляетесь до .NET 10 и код включает прямую ссылку на пакет, удалите эту ссылку System.Linq.Asyncна пакет или обновите ее до версии 7.0.0.0. Для мультитаргетинга как .NET 10, так и предыдущей версии, добавьте ссылку на System.Linq.AsyncEnumerable пакет вместо этого.

Если System.Linq.Async используется косвенно через другой пакет, избегайте неоднозначности ошибок, добавляя <ExcludeAssets> метаданные со значением compile или all:

  • Чтобы разрешить транзитивное использование System.Linq.Async, задайте <ExcludeAssets> для compileпараметра :

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

    Эта конфигурация предотвращает прямое использование в коде, позволяя другим пакетам продолжать использовать System.Linq.Async внутренне.

  • Для полного исключения установите значение <ExcludeAssets>all:

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

    Используйте эту конфигурацию только в том случае, если в среде выполнения не требуются зависимости System.Linq.Async.

Большинство используемого кода должно быть совместимо без изменений, но некоторые точки вызова могут потребовать обновления для ссылки на новые имена и сигнатуры. Например, вызов Select работает e.Select(i => i * 2) одинаково до и после. Однако вызов e.SelectAwait(async (int i, CancellationToken ct) => i * 2) необходимо изменить, чтобы использовать Select вместо SelectAwait, как в e.Select(async (int i, CancellationToken ct) => i * 2).

Полный набор доступных методов IAsyncEnumerable<T>расширения LINQ см. в документации по API System.Linq.AsyncEnumerable.

Затронутые API