Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA2021 |
| Tytuł | Nie wywoływanie Enumerable.Cast<T> lub Enumerable.OfType<T> z niezgodnymi typami |
| Kategoria | Niezawodność |
| Poprawka powodująca niezgodność lub niezgodność | Kluczowa |
| Domyślnie włączone na platformie .NET 10 | Jako ostrzeżenie |
Przyczyna
Wywołanie metody Enumerable.Cast<TResult>(IEnumerable) lub Enumerable.OfType<TResult>(IEnumerable) określa parametr typu niezgodny z typem kolekcji wejściowej.
Opis reguły
Enumerable.Cast<TResult>(IEnumerable) i Enumerable.OfType<TResult>(IEnumerable) wymagają zgodnych typów, aby wygenerować oczekiwany wynik:
- Ogólne rzutowanie używane przez sekwencję zwracaną przez Cast<TResult>(IEnumerable) powoduje wyrzucenie wyjątku InvalidCastException w czasie wykonywania dla elementów o niezgodnych typach.
- Sprawdzanie typu ogólnego używanego przez OfType<TResult>(IEnumerable) program nie powiedzie się z elementami niezgodnych typów, co powoduje pustą sekwencję.
Konwersje rozszerzające i konwersje zdefiniowane przez użytkownika nie są obsługiwane w przypadku typów ogólnych.
Jak naprawić naruszenia
Użyj zgodnego typu dla parametru Cast<TResult>(IEnumerable) typu i OfType<TResult>(IEnumerable).
Przykład
Poniższy fragment kodu pokazuje naruszenia:
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)
Poniższy fragment kodu przedstawia poprawki:
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)
Kiedy pomijać ostrzeżenia
Nie należy pomijać ostrzeżeń z tej reguły, ponieważ napotkasz wyjątki środowiska uruchomieniowego lub nieoczekiwane zachowanie (puste sekwencje).