CA2021: Não chamar Enumerable.Cast<T> ou Enumerable.OfType<T>com tipos incompatíveis

Propriedade Valor
ID da regra CA2021
Título Não chamar Enumerable.Cast<T> ou Enumerable.OfType<T> com tipos incompatíveis
Categoria Confiabilidade
Correção interruptiva ou sem interrupção Quebra
Habilitado por padrão no .NET 8 Como aviso

Causa

Uma chamada a Enumerable.Cast<TResult>(IEnumerable) ou Enumerable.OfType<TResult>(IEnumerable) especifica um parâmetro de tipo que é incompatível com o tipo da coleção de entrada.

Descrição da regra

Enumerable.Cast<TResult>(IEnumerable) e Enumerable.OfType<TResult>(IEnumerable) exigem tipos compatíveis para produzir o resultado esperado:

Não há suporte para a ampliação e conversões definidas pelo usuário com tipos genéricos.

Como corrigir violações

Use um tipo compatível para o parâmetro de tipo Cast<TResult>(IEnumerable) e OfType<TResult>(IEnumerable).

Exemplo

O seguinte snippet de código mostra as violações:

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)

O seguinte snippet de código mostra as correções:

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)

Quando suprimir avisos

Você não deve suprimir os avisos dessa regra, pois encontrará exceções de tempo de execução ou um comportamento inesperado (sequências vazias).