Språk
Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Egenskap | Värde |
|---|---|
| Regel-ID | CA2021 |
| Title | Anropa inte Enumerable.Cast<T> eller Enumerable.OfType<T> med inkompatibla typer |
| Kategori | Tillförlitlighet |
| Korrigeringen är antingen invasiv eller icke-invasiv | Avbrott |
| Aktiverad som standard i .NET 10 | Som varning |
| Tillämpliga språk | C# och Visual Basic |
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 typomvandling som används av sekvensen som returneras av Cast<TResult>(IEnumerable) kastar 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 i Cast<TResult>(IEnumerable) 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örningsundantag eller oväntat beteende (tomma sekvenser).