Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Property | valor |
|---|---|
| ID da regra | CA2021 |
| Título | Não ligue Enumerable.Cast<T> ou Enumerable.OfType<T> com tipos incompatíveis |
| Categoria | Fiabilidade |
| A correção está quebrando ou não quebrando | Quebrando |
| Habilitado por padrão no .NET 10 | Como aviso |
Motivo
Uma chamada para Enumerable.Cast<TResult>(IEnumerable) ou Enumerable.OfType<TResult>(IEnumerable) especifica um parâmetro type que é incompatível com o tipo da coleção de entrada.
Descrição da regra
Enumerable.Cast<TResult>(IEnumerable) e Enumerable.OfType<TResult>(IEnumerable) requerem tipos compatíveis para produzir o resultado esperado:
- O cast genérico usado pela sequência devolvida pela Cast<TResult>(IEnumerable) lança um InvalidCastException em tempo de execução em elementos de tipos incompatíveis.
- A verificação de tipo genérica usada por OfType<TResult>(IEnumerable) não terá êxito com elementos de tipos incompatíveis, resultando em uma sequência vazia.
A ampliação e as conversões definidas pelo usuário não são suportadas com tipos genéricos.
Como corrigir violações
Use um tipo compatível para o parâmetro type de Cast<TResult>(IEnumerable) e OfType<TResult>(IEnumerable).
Exemplo
O trecho de código a seguir mostra 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 trecho de código a seguir 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
Não deves suprimir avisos desta regra, pois vais encontrar exceções em tempo de execução ou comportamentos inesperados (sequências vazias).