Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.