Aracılığıyla paylaş


SYSLIB0061: IComparer<TSource> alan System.Linq.Queryable.MaxBy ve System.Linq.Queryable.MinBy kullanımdan kaldırıldı.

.NET 10'dan itibaren, IComparer<TSource> kabul eden System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) ve System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) uzantı yöntemleri kullanım dışıdır. Lütfen bunun yerine kabul IComparer<TKey> eden yeni eklenen aşırı yüklemeleri kullanın.

Kodda bu eski uzantı yöntemlerini çağırmak derleme zamanında uyarı SYSLIB0061 oluşturur ve genellikle çalışma zamanında bir IndexOutOfRangeException oluşturur.

Kullanımdan kaldırılmış olma nedeni

Özgün MaxBy ve MinBy kabul edilen ifade IComparer<T>? comparer parametresi, tür parametresi için genel tür TSourceIComparer<T>? comparer kullanılarak yanlış uygulandı. Bu yanlıştır çünkü Comparer<T>.Compare(T, T) yöntemine geçirilen değerler Expression<Func<TSource, TKey>> keySelector ifade parametresi tarafından seçilir, bu nedenle ayıklanan değer TKey genel türündedir.

Uyarı

Bu, daha önce yalnızca TSource ve TKey aslında aynı yapı türündeyse çalışırdı. Türler farklıysa, bir çalışma zamanı hatası IndexOutOfRangeException: Dizin, dizinin sınırlarının dışındaydı.IQueryable<TSource> source için gerekli uzantı yöntemi bulunamadığı için (örneğin, MaxBy içinde) fırlatılırdı.

Geçici çözüm

Yeni eklenen ve IComparer<TKey>? comparer parametresini kabul eden MaxBy veya MinBy yöntemini kullanın. Bunlar istisna oluşturmaz.

Örneğin:

// 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);

Uyarıyı gizleme

Eski API'yi kullanmanız gerekiyorsa, uyarıyı kodda veya proje dosyanızda gizleyebilirsiniz.

Yalnızca tek bir ihlali engellemek için, önişlemci yönergelerini kaynak dosyanıza ekleyerek uyarıyı devre dışı bırakın ve sonra yeniden etkinleştirin.

// Disable the warning.
#pragma warning disable SYSLIB0061

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

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

Projenizdeki tüm SYSLIB0061 uyarılarını engellemek için proje dosyanıza bir <NoWarn> özelliği ekleyin.

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

Daha fazla bilgi için bkz. uyarıları gizleme.