.NET 10 では、AsyncEnumerable型の LINQ 拡張メソッドの完全なセットを提供するIAsyncEnumerable<T> クラスが導入されています。 このクラスは、コミュニティが管理する NuGet ライブラリSystem.Linq.Async置き換えられ、あいまいさのためにコンパイル エラーが発生する可能性があります。
導入されたバージョン
.NET 10
以前の動作
以前は、コミュニティが管理するAsyncEnumerableパッケージのSystem.Linq.Async クラスは、IAsyncEnumerable<T>の LINQ サポートを提供しました。
新しい動作
.NET 10 および AsyncEnumerable NuGet パッケージの System.Linq.AsyncEnumerable クラスは、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 のドキュメントを参照してください。
影響を受ける API
.NET