Freigeben über


SYSLIB0061: "System.Linq.Queryable.MaxBy" und "System.Linq.Queryable.MinBy" für IComparer<TSource> sind veraltet.

Ab .NET 10 sind die beiden Erweiterungsmethoden System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) , System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) die akzeptieren IComparer<TSource> , veraltet. Verwenden Sie die neu hinzugefügten Überladungen, die stattdessen eine IComparer<TKey> Überladung akzeptieren.

Beim Aufrufen dieser alten Erweiterungsmethoden im Code wird zur Kompilierungszeit eine Warnung SYSLIB0061 generiert und in der Regel zur Laufzeit eine IndexOutOfRangeException Warnung generiert.

Grund für Verschleierung

Das Original MaxBy und MinBy das Akzeptieren eines IComparer<T>? comparer Ausdrucksparameters wurden mit dem generischen Typ TSource für den IComparer<T>? comparer Typparameter falsch implementiert. Dies ist falsch, da die an die Comparer<T>.Compare(T, T) Methode übergebenen Werte vom Expression<Func<TSource, TKey>> keySelector Ausdrucksparameter ausgewählt werden und somit der extrahierte Wert vom generischen Typ TKeyist.

Hinweis

Dies würde früher nur funktionieren, wenn TSource und TKey tatsächlich derselbe konstruierte Typ wäre. Wenn die Typen voneinander unterschieden wurden, wurde eine Laufzeit IndexOutOfRangeException: Index liegt außerhalb der Grenzen des Arrays. Würde ausgelöst, da die erforderliche Erweiterungsmethode nicht IQueryable<TSource> source gefunden werden konnte (z. B. in MaxBy).

Zwischenlösung

Verwenden Sie die neu hinzugefügte MaxBy oder MinBy Methode, die einen IComparer<TKey>? comparer Parameter akzeptiert. Diese lösen keine Ausnahme aus.

Beispiel:

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

Unterdrücken einer Warnung

Wenn Sie die veraltete API verwenden müssen, können Sie die Warnung im Code oder in der Projektdatei unterdrücken.

Um nur einen einzelnen Verstoß zu unterdrücken, fügen Sie Ihrer Quelldatei Präprozessordirektiven hinzu, um die Warnung zu deaktivieren und dann erneut zu aktivieren.

// Disable the warning.
#pragma warning disable SYSLIB0061

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

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

Um alle SYSLIB0061 Warnungen in Ihrem Projekt zu unterdrücken, fügen Sie ihrer Projektdatei eine <NoWarn> Eigenschaft hinzu.

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

Weitere Informationen finden Sie unter "Unterdrücken von Warnungen".