CA2021 : Ne pas appeler Enumerable.Cast<T> ou Enumerable.OfType<T> avec des types incompatibles

Propriété Value
Identificateur de la règle CA2021
Titre Ne pas appeler Enumerable.Cast<T> ou Enumerable.OfType<T> avec des types incompatibles
Catégorie Fiabilité
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 Comme avertissement

Cause

Un appel à Enumerable.Cast<TResult>(IEnumerable) ou Enumerable.OfType<TResult>(IEnumerable) spécifie un paramètre de type incompatible avec le type de la collection d’entrée.

Description de la règle

Enumerable.Cast<TResult>(IEnumerable) et Enumerable.OfType<TResult>(IEnumerable) nécessitent des types compatibles pour produire le résultat attendu :

Les conversions étendues et définies par l’utilisateur ne sont pas prises en charge avec les types génériques.

Comment corriger les violations

Utilisez un type compatible pour le paramètre de type Cast<TResult>(IEnumerable) et OfType<TResult>(IEnumerable).

Exemple

L’extrait de code suivant montre des violations :

var foods = new List<Food>();
// Violation - Food is incompatible with Beverages.
var drinks = Enumerable.Cast<Beverages>(foods);
// Violation - Food is incompatible with Beverages.
var drinks2 = Enumerable.OfType<Beverages>(foods);

class Food { }
class Bread : Food { }
class Beverages { }
' Violation - Integer is incompatible with String.
Dim a1 = (Array.Empty(Of Integer)()).Cast(Of String)
' Violation - Integer is incompatible with String.
Dim a1 = (Array.Empty(Of Integer)()).OfType(Of String)

L’extrait de code suivant montrent les correctifs :

var foods = new List<Food>();
// Bread is compatible with Food.
var breads = Enumerable.Cast<Bread>(foods);
// Bread is compatible with Food.
var breads2 = Enumerable.OfType<Bread>(foods);

class Food { }
class Bread : Food { }
class Beverages { }
' Integer is compatible with Object.
Dim a1 = (Array.Empty(Of Integer)()).Cast(Of Object)
' Integer is compatible with Object.
Dim a1 = (Array.Empty(Of Integer)()).OfType(Of Object)

Quand supprimer les avertissements

Vous ne devez pas supprimer les avertissements de cette règle, car vous pouvez rencontrer des exceptions au moment de l’exécution ou un comportement inattendu (séquences vides).