SYSLIB0061: A System.Linq.Queryable.MaxBy és a System.Linq.Queryable.MinBy egy IComparer<TSource-t> vesz, elavultak

A .NET 10-től kezdődően a két bővítménymetely System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) elavult System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>)IComparer<TSource>. Kérjük, inkább az újonnan hozzáadott túlterheléseket használja, amelyek elfogadnak egy IComparer<TKey> elemet.

Ezeknek a régi kiterjesztési metódusoknak a kódban való meghívása figyelmeztetést SYSLIB0061 generál fordítási időben, és általában futásidőben generál egy IndexOutOfRangeException .

Az elavulás oka

Az eredeti MaxBy és MinBy, amely egy IComparer<T>? comparer kifejezési paramétert fogad el, helytelenül implementálták, mivel a TSource típusparaméterhez az általános IComparer<T>? comparer típust használták. Ez helytelen, mert a metódusnak Comparer<T>.Compare(T, T) átadott értékeket a Expression<Func<TSource, TKey>> keySelector kifejezésparaméter választja ki, így a kinyert érték általános típusú TKey.

Megjegyzés

Ez korábban csak akkor működött, ha TSource és TKey valójában ugyanaz a konstrukciójú típus voltak. Ha a típusok eltérőek voltak, akkor a futtatási környezet egy hibát dobna: IndexOutOfRangeException: Az index a tömb határain kívül volt. Ezt azért tenné, mert nem található a szükséges bővítménymetódus IQueryable<TSource> source (például a MaxBy).

áthidaló megoldás

Használja az újonnan hozzáadott MaxBy vagy MinBy metódust, amely elfogad egy IComparer<TKey>? comparer paramétert. Ezek nem fognak kivételt kivenni.

Például:

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

Figyelmeztetés mellőzése

Ha az elavult API-t kell használnia, letilthatja a figyelmeztetést a kódban vagy a projektfájlban.

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz, hogy letiltsa, majd engedélyezze újra a figyelmeztetést.

// Disable the warning.
#pragma warning disable SYSLIB0061

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

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

Ha el szeretné tiltani a projekt összes SYSLIB0061 figyelmeztetését, adjon hozzá egy <NoWarn> tulajdonságot a projektfájlhoz.

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

További információ: Figyelmeztetések letiltása.