Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.