Bagikan melalui


System.Linq.AsyncEnumerable di .NET 10

.NET 10 memperkenalkan AsyncEnumerable kelas , yang menyediakan serangkaian lengkap metode ekstensi LINQ untuk jenis tersebut IAsyncEnumerable<T> . Kelas ini menggantikan pustaka NuGet yang dikelola System.Linq.Async komunitas, berpotensi menyebabkan kesalahan kompilasi karena ambiguitas.

Versi yang diperkenalkan

.NET 10

Perilaku sebelumnya

Sebelumnya, AsyncEnumerable kelas dalam paket yang dikelola oleh System.Linq.Async komunitas memberikan dukungan LINQ untuk IAsyncEnumerable<T>.

Perilaku baru

Kelas AsyncEnumerable di .NET 10, dan dalam System.Linq.AsyncEnumerable paket NuGet, menyediakan dukungan LINQ untuk IAsyncEnumerable<T>.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini dapat memengaruhi kompatibilitas sumber.

Alasan perubahan

IAsyncEnumerable<T> adalah antarmuka yang umum digunakan, sehingga platform itu sendiri harus memberikan dukungan LINQ untuk jenis tersebut. Pengelola System.Linq.Async dan anggota komunitas lainnya mengajukan petisi untuk dimasukkan langsung di platform.

Jika Anda meningkatkan ke .NET 10 dan kode Anda menyertakan referensi paket langsung ke System.Linq.Async, hapus referensi paket tersebut atau tingkatkan ke versi 7.0.0. Untuk multitarget baik .NET 10 maupun versi sebelumnya, tambahkan referensi paket ke System.Linq.AsyncEnumerable sebagai gantinya.

Jika System.Linq.Async digunakan secara tidak langsung melalui paket lain, hindari kesalahan ambiguitas dengan menambahkan <ExcludeAssets> metadata dengan nilai compile atau all:

  • Untuk mengizinkan penggunaan secara transitif, atur System.Linq.Async ke <ExcludeAssets>.

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

    Konfigurasi ini mencegah penggunaan langsung dalam kode Anda sambil memungkinkan paket lain untuk terus menggunakan System.Linq.Async secara internal.

  • Untuk pengecualian lengkap, atur <ExcludeAssets> ke all:

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

    Gunakan konfigurasi ini hanya jika Anda yakin tidak ada dependensi yang memerlukan System.Linq.Async saat runtime.

Sebagian besar kode yang mengkonsumsi harus kompatibel tanpa perubahan, tetapi beberapa situs panggilan mungkin memerlukan pembaruan untuk merujuk ke nama dan tanda tangan yang lebih baru. Misalnya, Select panggilan seperti e.Select(i => i * 2) berfungsi sama sebelum dan sesudah. Namun, panggilan e.SelectAwait(async (int i, CancellationToken ct) => i * 2) perlu diubah untuk digunakan Select alih-alih SelectAwait, seperti dalam e.Select(async (int i, CancellationToken ct) => i * 2).

Untuk set lengkap metode ekstensi LINQ yang tersedia untuk IAsyncEnumerable<T>, lihat dokumentasi SYSTEM.Linq.AsyncEnumerable API.

API yang terpengaruh