Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í.