.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>元数据,并将其值设为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) 中所示。
有关可用于的完整 LINQ 扩展方法集,请参阅 IAsyncEnumerable<T>。