SYSLIB0061: System.Linq.Queryable.MaxBy a System.Linq.Queryable.MinBy, který přebírá IComparer<TSource> , jsou zastaralé.

Počínaje verzí .NET 10 jsou dvě metody System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) rozšíření, System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) které přijímají IComparer<TSource> zastaralé. Použijte nově přidaná přetížení, která místo toho přijímají.IComparer<TKey>

Volání těchto starých metod rozšíření v kódu generuje upozornění SYSLIB0061 v době kompilace a obvykle generuje IndexOutOfRangeException za běhu.

Důvod obsoletion

MaxBy Původní a MinBy přijetí parametru výrazu IComparer<T>? comparer bylo nesprávně implementováno pomocí obecného typu TSource parametru IComparer<T>? comparer typu. To je nesprávné, protože hodnoty předané metodě Comparer<T>.Compare(T, T) jsou vybrány parametrem Expression<Func<TSource, TKey>> keySelector výrazu, a proto extrahovaná hodnota je obecný typ TKey.

Poznámka:

To by dříve fungovalo pouze tehdy, kdyby TSource a TKey byly ve skutečnosti stejný konstruovaný typ. Pokud byly typy odlišné, modul runtime IndexOutOfRangeException: Index byl mimo hranice pole. Byl by vyvolán, protože nebyla nalezena potřebná rozšiřující metoda ( IQueryable<TSource> source například v MaxBy).

Řešení problému

Použijte nově přidanou MaxBy metodu nebo MinBy metodu IComparer<TKey>? comparer , která přijímá parametr. Tyto výjimky nevyvolají výjimku.

Například:

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

Potlačení upozornění

Pokud musíte použít zastaralé rozhraní API, můžete potlačit upozornění v kódu nebo v souboru projektu.

Chcete-li potlačit pouze jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, které chcete zakázat a znovu povolit upozornění.

// Disable the warning.
#pragma warning disable SYSLIB0061

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

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

Pokud chcete potlačit všechna SYSLIB0061 upozornění v projektu, přidejte <NoWarn> do souboru projektu vlastnost.

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

Další informace naleznete v tématu Potlačení upozornění.