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 :
- Le cast générique utilisé par la séquence renvoyée par Cast<TResult>(IEnumerable) lève InvalidCastException au moment de l’exécution sur les éléments de types incompatibles.
- La vérification de type générique utilisée par OfType<TResult>(IEnumerable) ne réussit pas avec les éléments de types incompatibles, ce qui entraîne une séquence vide.
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).