.NET 10 中的 System.Linq.AsyncEnumerable

.NET 10 引入了该 AsyncEnumerable 类,该类为该类型提供了一组完整的 LINQ 扩展方法 IAsyncEnumerable<T> 。 此类取代了社区维护的 System.Linq.Async NuGet 库,可能会因含糊不清而导致编译错误。

引入的版本

.NET 10

以前的行为

以前,AsyncEnumerable社区维护System.Linq.Async中的类为 LINQ 提供支持IAsyncEnumerable<T>

新行为

.NET 10 和 AsyncEnumerable中的 System.Linq.AsyncEnumerable 类为 提供了 LINQ 支持。

破坏性变更的类型

此更改可能会影响 源兼容性

更改原因

IAsyncEnumerable<T> 是一个常用的接口,因此平台本身应为该类型提供 LINQ 支持。 System.Linq.Async 的维护者和其他社区成员请求将其直接纳入平台。

如果要升级到 .NET 10,并且代码中直接引用了包System.Linq.Async,请删除该包引用。 对于 .NET 10 和更早版本的多目标框架,请改为添加一个包引用而不是 System.Linq.AsyncEnumerable

如果通过另一个包间接使用System.Linq.Async,请通过添加<ExcludeAssets>元数据,并将其值设为compileall来避免歧义错误。

  • 要允许传递使用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) 中所示。

有关可用于的完整 LINQ 扩展方法集,请参阅 IAsyncEnumerable<T>

受影响的 API