Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2021 |
| Заголовок | Не вызывайте или Enumerable.Cast<T> не вызывайте Enumerable.OfType<T> несовместимые типы |
| Категория | Надежность |
| Исправление является критическим или не критическим | Критическое |
| Включен по умолчанию в .NET 10 | Как предупреждение |
Причина
Вызов Enumerable.Cast<TResult>(IEnumerable) или Enumerable.OfType<TResult>(IEnumerable) задает параметр типа, несовместимый с типом входной коллекции.
Описание правила
Enumerable.Cast<TResult>(IEnumerable) и Enumerable.OfType<TResult>(IEnumerable) требуются совместимые типы для получения ожидаемого результата:
- Обобщённое приведение, используемое последовательностью, возвращаемой Cast<TResult>(IEnumerable), вызывает исключение InvalidCastException во время выполнения для элементов несовместимых типов.
- Проверка универсального типа, используемая OfType<TResult>(IEnumerable) не будет выполнена с элементами несовместимых типов, что приводит к пустой последовательности.
Расширение и определяемые пользователем преобразования не поддерживаются универсальными типами.
Устранение нарушений
Используйте совместимый тип для параметра Cast<TResult>(IEnumerable) типа и OfType<TResult>(IEnumerable).
Пример
В следующем фрагменте кода показаны нарушения:
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)
В следующем фрагменте кода показаны исправления:
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)
Когда лучше отключить предупреждения
Вы не должны подавлять предупреждения из этого правила, так как вы столкнетесь с исключениями среды выполнения или непредвиденным поведением (пустые последовательности).