CA2021: No llamar a Enumerable.Cast<T> o Enumerable.OfType<T> con tipos incompatibles
Propiedad | Value |
---|---|
Identificador de la regla | CA2021 |
Título | No llame a Enumerable.Cast<T> ni Enumerable.OfType<T> con tipos incompatibles |
Categoría | Confiabilidad |
La corrección es problemática o no problemática | Problemático |
Habilitado de forma predeterminada en .NET 9 | Como advertencia |
Causa
Una llamada a Enumerable.Cast<TResult>(IEnumerable) o Enumerable.OfType<TResult>(IEnumerable) especifica un parámetro de tipo incompatible con el tipo de la colección de entrada.
Descripción de la regla
Enumerable.Cast<TResult>(IEnumerable) y Enumerable.OfType<TResult>(IEnumerable) requieren tipos compatibles para generar el resultado esperado:
- La conversión genérica usada por la secuencia devuelta por Cast<TResult>(IEnumerable) produce una InvalidCastException en tiempo de ejecución en elementos de tipos incompatibles.
- La comprobación de tipos genéricos usada por OfType<TResult>(IEnumerable) no se realizará correctamente con elementos de tipos incompatibles, lo que da lugar a una secuencia vacía.
Las conversiones de ampliación y definidas por el usuario no se admiten con tipos genéricos.
Cómo corregir infracciones
Use un tipo compatible para el parámetro de tipo de Cast<TResult>(IEnumerable) y OfType<TResult>(IEnumerable).
Ejemplo
En el siguiente fragmento de código se muestran las infracciones:
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)
En el siguiente fragmento de código se muestran las correcciones:
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)
Cuándo suprimir las advertencias
No debe suprimir las advertencias de esta regla, ya que encontrará excepciones en tiempo de ejecución o un comportamiento inesperado (secuencias vacías).