CA2021: Non chiamare Enumerable.Cast<T> o Enumerable.OfType<T> con tipi incompatibili
Proprietà | valore |
---|---|
ID regola | CA2021 |
Title | Non chiamare Enumerable.Cast<T> o Enumerable.OfType<T> con tipi incompatibili |
Categoria | Affidabilità |
La correzione causa un'interruzione o meno | Interruzione |
Abilitato per impostazione predefinita in .NET 9 | Come avviso |
Causa
Una chiamata a Enumerable.Cast<TResult>(IEnumerable) o Enumerable.OfType<TResult>(IEnumerable) specifica un parametro di tipo non compatibile con il tipo della raccolta di input.
Descrizione regola
Enumerable.Cast<TResult>(IEnumerable) e Enumerable.OfType<TResult>(IEnumerable) richiedono tipi compatibili per produrre il risultato previsto:
- Il cast generico usato dalla sequenza restituita da Cast<TResult>(IEnumerable) genera un oggetto InvalidCastException in fase di esecuzione su elementi di tipi incompatibili.
- Il controllo del tipo generico usato da OfType<TResult>(IEnumerable) non avrà esito positivo con elementi di tipi incompatibili, con conseguente sequenza vuota.
Le conversioni che supportano un maggior numero di dati e le conversioni definite dall'utente non sono supportate con i tipi generici.
Come correggere le violazioni
Usare un tipo compatibile per il parametro di tipo di Cast<TResult>(IEnumerable) e OfType<TResult>(IEnumerable).
Esempio
Il frammento di codice seguente mostra le violazioni:
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)
Il frammento di codice seguente mostra le correzioni:
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 eliminare gli avvisi
Non è consigliabile eliminare gli avvisi da questa regola, perché si verificano eccezioni in fase di esecuzione o comportamenti imprevisti (sequenze vuote).