SYSLIB0061: System.Linq.Queryable.MaxBy dan System.Linq.Queryable.MinBy mengambil IComparer<TSource> sudah usang

Mulai di .NET 10, dua metode ekstensi System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) dan System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) yang menerima IComparer<TSource> sudah usang. Silakan gunakan kelebihan beban yang baru ditambahkan yang menerima sebagai IComparer<TKey> gantinya.

Memanggil metode ekstensi lama ini dalam kode menghasilkan peringatan SYSLIB0061 pada waktu kompilasi dan biasanya menghasilkan IndexOutOfRangeException pada waktu proses.

Alasan kedaluarsa

Parameter asal MaxBy dan MinBy yang menerima parameter ekspresi IComparer<T>? comparer diimplementasikan secara salah menggunakan jenis generik TSource untuk parameter jenis IComparer<T>? comparer. Ini salah karena nilai yang diteruskan ke metode Comparer<T>.Compare(T, T) dipilih oleh parameter Expression<Func<TSource, TKey>> keySelector ekspresi, sehingga nilai yang diekstrak berjenis TKey generik.

Nota

Ini sebelumnya hanya akan berfungsi jika TSource dan TKey sebenarnya adalah jenis konstruksi yang sama. Jika jenisnya berbeda, maka runtime IndexOutOfRangeException: Indeks berada di luar batas array. akan dilemparkan karena metode ekstensi yang diperlukan untuk IQueryable<TSource> source tidak dapat ditemukan (misalnya di MaxBy).

Penanganan masalah

Gunakan MaxBy atau MinBy yang baru ditambahkan yang menerima parameter IComparer<TKey>? comparer. Ini tidak akan menghasilkan pengecualian.

Contohnya:

// This worked correctly since TKey and TSource are both int.
Enumerable.Range(1, 10)
    .AsQueryable()
    .MaxBy(key => (0 - key), Comparer<int>.Default);

// This would throw since TKey is string but TSource is int
// and will trigger the obsoletion warning now and would
// throw an exeception at runtime.
Enumerable.Range(1, 10)
    .AsQueryable()
    .MaxBy(key => key.ToString(), Comparer<int>.Default);

// This previously would not compile before to the addition of
// the new methods since TKey is string and TSource is int.
// It will now compile and execute correctly.
Enumerable.Range(1, 10)
    .AsQueryable()
    .MaxBy(key => key.ToString(), Comparer<string>.Default);

Menyembunyikan peringatan

Jika Anda harus menggunakan API usang, Anda dapat menekan peringatan dalam kode atau dalam file proyek Anda.

Untuk menekan hanya satu pelanggaran, tambahkan direktif praprosedur ke file sumber Anda untuk menonaktifkan lalu mengaktifkan kembali peringatan.

// Disable the warning.
#pragma warning disable SYSLIB0061

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0061

Untuk menyembunyikan semua peringatan SYSLIB0061 dalam proyek Anda, tambahkan properti <NoWarn> ke file proyek Anda.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0061</NoWarn>
  </PropertyGroup>
</Project>

Untuk informasi lebih lanjut, lihat Sembunyikan peringatan.