Delen via


SYSLIB0061: System.Linq.Queryable.MaxBy en System.Linq.Queryable.MinBy waarbij een IComparer<TSource> wordt gebruikt, zijn verouderd

Vanaf .NET 10 zijn de twee extensiemethoden System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) en System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) die accepteren een IComparer<TSource> verouderd. Gebruik de zojuist toegevoegde overbelastingen die een IComparer<TKey> in plaats daarvan accepteren.

Als u deze oude extensiemethoden aanroept in code, wordt er een waarschuwing SYSLIB0061 gegenereerd tijdens het compileren en wordt er doorgaans een IndexOutOfRangeException tijdens runtime gegenereerd.

Reden voor afschaffing

Het origineel MaxBy en MinBy het accepteren van een IComparer<T>? comparer expressieparameter zijn onjuist geïmplementeerd met behulp van het algemene type TSource voor de IComparer<T>? comparer typeparameter. Dit is onjuist omdat de waarden die worden doorgegeven aan de Comparer<T>.Compare(T, T) methode worden geselecteerd door de Expression<Func<TSource, TKey>> keySelector expressieparameter, waardoor de geëxtraheerde waarde van het algemene type TKeyis.

Opmerking

Dit zou voorheen alleen werken als TSource en TKey eigenlijk hetzelfde geconstrueerde type waren. Als de typen verschillend zijn, is er een runtime IndexOutOfRangeException: Index valt buiten de grenzen van de matrix. Wordt gegenereerd omdat de benodigde extensiemethode IQueryable<TSource> source niet kan worden gevonden (bijvoorbeeld in MaxBy).

Tijdelijke maatregel

Gebruik de zojuist toegevoegde MaxBy methode of MinBy methode die een IComparer<TKey>? comparer parameter accepteert. Deze genereren geen uitzondering.

Voorbeeld:

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

Een waarschuwing onderdrukken

Als u de verouderde API moet gebruiken, kunt u de waarschuwing in code of in het projectbestand onderdrukken.

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de waarschuwing uit te schakelen en vervolgens opnieuw in te schakelen.

// Disable the warning.
#pragma warning disable SYSLIB0061

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

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

Als u alle SYSLIB0061 waarschuwingen in uw project wilt onderdrukken, voegt u een <NoWarn> eigenschap toe aan het projectbestand.

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

Zie Waarschuwingen onderdrukken voor meer informatie.