.NET 10 引入了 AsyncEnumerable 類別,它為 IAsyncEnumerable<T> 類型提供了一整套 LINQ 擴展方法。 此類別取代了社群維護的 NuGet 程式庫,可能因為模糊不清而導致編譯錯誤。
推出的版本
.NET 10
先前的行為
先前在AsyncEnumerable社群維護的System.Linq.Async套件中的類別提供了LINQ的支援IAsyncEnumerable<T>。
新行為
.NET 10 中的 AsyncEnumerable 類別,以及 System.Linq.AsyncEnumerable NuGet 套件,為 IAsyncEnumerable<T> 提供 LINQ 支援。
破壞性變更的類型
此變更可能會影響 來源相容性。
變更的原因
IAsyncEnumerable<T> 是一個常用的接口,因此平台本身應該為該類型提供 LINQ 支援。
System.Linq.Async的維護者和其他社群成員請願要求直接在平台中納入。
建議的動作
如果你正在升級到 .NET 10,且你的程式碼包含直接的套件參考, System.Linq.Async請移除該套件參考或 升級到 7.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 擴充方法集合,請參閱 System.Linq.AsyncEnumerable API 文件。