Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À compter de .NET 10, les deux méthodes System.Linq.Queryable.MaxBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) d’extension et System.Linq.Queryable.MinBy<TSource,TKey>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, IComparer<TSource>) qui acceptent un IComparer<TSource> sont obsolètes. Utilisez les surcharges nouvellement ajoutées qui acceptent une IComparer<TKey> place.
L’appel de ces anciennes méthodes d’extension dans le code génère un avertissement SYSLIB0061 au moment de la compilation et génère généralement un IndexOutOfRangeException au moment de l’exécution.
Raison de l’obsoletion
L’original MaxBy et MinBy l’acceptation d’un paramètre d’expression IComparer<T>? comparer ont été implémentés de manière incorrecte à l’aide du type TSource générique pour le paramètre de IComparer<T>? comparer type. Cela est incorrect, car les valeurs passées à la Comparer<T>.Compare(T, T) méthode sont sélectionnées par le Expression<Func<TSource, TKey>> keySelector paramètre d’expression. Par conséquent, la valeur extraite est de type TKeygénérique.
Note
Cela ne fonctionnerait précédemment que si TSource et TKey étaient en fait le même type construit. Si les types étaient distincts, un runtime IndexOutOfRangeException: l’index était en dehors des limites du tableau. Il serait levée, car la méthode d’extension nécessaire pour IQueryable<TSource> source laquelle la méthode d’extension est introuvable (par exemple dans MaxBy).
Contournement
Utilisez la méthode ou MinBy l’ajout qui vient d’être ajouté MaxBy qui accepte un IComparer<TKey>? comparer paramètre. Celles-ci ne lèvent pas d’exception.
Par exemple:
// 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);
Supprimer un avertissement
Si vous devez utiliser l’API obsolète, vous pouvez supprimer l’avertissement dans le code ou dans votre fichier projet.
Pour supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver, puis réactivez l’avertissement.
// Disable the warning.
#pragma warning disable SYSLIB0061
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0061
Pour supprimer tous les SYSLIB0061 avertissements dans votre projet, ajoutez une <NoWarn> propriété à votre fichier projet.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0061</NoWarn>
</PropertyGroup>
</Project>
Pour plus d’informations, consultez Supprimer les avertissements.