Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2021 |
| Název | Nevolat Enumerable.Cast<T> nebo Enumerable.OfType<T> s nekompatibilními typy |
| Kategorie | Spolehlivost |
| Oprava způsobující chybu nebo chybu způsobující chybu | Narušující |
| Povoleno ve výchozím nastavení v .NET 10 | Jako upozornění |
Příčina
Volání Enumerable.Cast<TResult>(IEnumerable) nebo Enumerable.OfType<TResult>(IEnumerable) určuje parametr typu, který není kompatibilní s typem vstupní kolekce.
Popis pravidla
Enumerable.Cast<TResult>(IEnumerable) a Enumerable.OfType<TResult>(IEnumerable) k vytvoření očekávaného výsledku vyžadují kompatibilní typy:
- Obecné přetypování používané sekvencí vrácenou Cast<TResult>(IEnumerable) vyvolá za běhu InvalidCastException u prvků nekompatibilních typů.
- Obecná kontrola typu použitá OfType<TResult>(IEnumerable) v případě, že prvky nekompatibilních typů nebudou úspěšné, což vede k prázdné sekvenci.
Rozšíření a uživatelem definované převody nejsou podporovány u obecných typů.
Jak opravit porušení
Pro parametr Cast<TResult>(IEnumerable) typu a OfType<TResult>(IEnumerable).
Příklad
Následující fragment kódu ukazuje porušení:
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)
Následující fragment kódu ukazuje opravy:
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)
Kdy potlačit upozornění
Upozornění z tohoto pravidla byste neměli potlačovat, protože to může vést buď k běhovým výjimkám, nebo k neočekávanému chování (prázdné sekvence).