CA2021: Anropa inte Enumerable.Cast<T> eller Enumerable.OfType<T> med inkompatibla typer
Property | Värde |
---|---|
Regel-ID | CA2021 |
Title | Anropa Enumerable.Cast<T> inte eller Enumerable.OfType<T> med inkompatibla typer |
Kategori | Tillförlitlighet |
Korrigeringen är icke-bakåtkompatibel | Brott |
Aktiverad som standard i .NET 9 | Som varning |
Orsak
Ett anrop till Enumerable.Cast<TResult>(IEnumerable) eller Enumerable.OfType<TResult>(IEnumerable) anger en typparameter som inte är kompatibel med typen av indatasamling.
Regelbeskrivning
Enumerable.Cast<TResult>(IEnumerable) och Enumerable.OfType<TResult>(IEnumerable) kräver kompatibla typer för att generera det förväntade resultatet:
- Den generiska gjutning som används av sekvensen som returneras av Cast<TResult>(IEnumerable) genererar en InvalidCastException vid körning på element av inkompatibla typer.
- Kontrollen av generisk typ som används av OfType<TResult>(IEnumerable) lyckas inte med element av inkompatibla typer, vilket resulterar i en tom sekvens.
Breddning och användardefinierade konverteringar stöds inte med generiska typer.
Så här åtgärdar du överträdelser
Använd en kompatibel typ för typparametern Cast<TResult>(IEnumerable) för och OfType<TResult>(IEnumerable).
Exempel
Följande kodfragment visar överträdelser:
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)
Följande kodfragment visar korrigeringarna:
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)
När du ska ignorera varningar
Du bör inte ignorera varningar från den här regeln eftersom du antingen stöter på körningsfel eller oväntat beteende (tomma sekvenser).