Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A partir do .NET 10, os dois métodos System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) de extensão e System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) que aceitam um IComparer<TSource> são obsoletos. Use as sobrecargas recém-adicionadas que aceitam uma IComparer<TKey> .
Chamar esses métodos de extensão antigos no código gera aviso SYSLIB0061 em tempo de compilação e normalmente gera um IndexOutOfRangeException em runtime.
Motivo da obsoletidade
O parâmetro original MaxBy e MinBy de aceitação de uma IComparer<T>? comparer expressão foram implementados incorretamente usando o tipo TSource genérico para o parâmetro de IComparer<T>? comparer tipo. Isso está incorreto porque os valores passados para o Comparer<T>.Compare(T, T) método são selecionados pelo parâmetro de Expression<Func<TSource, TKey>> keySelector expressão, portanto, o valor extraído é de tipo TKeygenérico.
Observação
Isso funcionaria anteriormente apenas se TSource e TKey fosse, na verdade, o mesmo tipo construído. Se os tipos fossem distintos, um runtimeIndexOutOfRangeException: o índice estava fora dos limites da matriz. Seria gerado porque não foi possível encontrar o método IQueryable<TSource> source de extensão necessário (por exemplo, ).MaxBy
Solução Alternativa
Use o método recém-adicionado MaxBy ou MinBy que aceita um IComparer<TKey>? comparer parâmetro. Isso não gerará uma exceção.
Por exemplo:
// 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);
Suprimir um aviso
Se você precisar usar a API obsoleta, poderá suprimir o aviso no código ou no arquivo de projeto.
Para suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desabilitar e, em seguida, reabilitar o aviso.
// Disable the warning.
#pragma warning disable SYSLIB0061
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0061
Para suprimir todos os SYSLIB0061 avisos em seu projeto, adicione uma <NoWarn> propriedade ao arquivo de projeto.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0061</NoWarn>
</PropertyGroup>
</Project>
Para obter mais informações, consulte Suprimir avisos.