Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
CA2021: не вызывайте Enumerable.Cast
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2021 |
| Заголовок | Не вызывайте Enumerable.Cast<T> или Enumerable.OfType<T> с несовместимыми типами |
| Категория | Надежность |
| Исправление является критическим или не критическим | Срочное |
| Включен по умолчанию в .NET 10 | Как предупреждение |
| Применимые языки | C# и Visual Basic |
Причина
Вызов 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)
Когда лучше отключить предупреждения
Вы не должны подавлять предупреждения из этого правила, так как вы столкнетесь с исключениями среды выполнения или непредвиденным поведением (пустые последовательности).