Teilen über


CA2021: Enumerable.Cast<T> oder Enumerable.OfType<T>nicht mit inkompatiblen Typen aufrufen

Eigenschaft Wert
Regel-ID CA2021
Titel Rufen Sie Enumerable.Cast<T> oder Enumerable.OfType<T> nicht mit inkompatiblen Typen auf
Kategorie Zuverlässigkeit
Fix führt oder führt nicht zur Unterbrechung Breaking
Standardmäßig in .NET 10 aktiviert Als Warnung

Ursache

Im Aufruf von Enumerable.Cast<TResult>(IEnumerable) oder Enumerable.OfType<TResult>(IEnumerable) wird ein Typparameter angegeben, der nicht mit dem Typ der Eingabeauflistung kompatibel ist.

Regelbeschreibung

Enumerable.Cast<TResult>(IEnumerable) und Enumerable.OfType<TResult>(IEnumerable) erfordern kompatible Typen, um das erwartete Ergebnis zu erzielen:

Erweiternde und benutzerdefinierte Konvertierungen werden mit generischen Typen nicht unterstützt.

Behandeln von Verstößen

Verwenden Sie einen kompatiblen Typ für den Typparameter von Cast<TResult>(IEnumerable) und OfType<TResult>(IEnumerable).

Beispiel

Das folgende Codeschnipsel zeigt Verstöße:

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)

Das folgende Codeschnipsel zeigt die Fixes:

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)

Wann sollten Warnungen unterdrückt werden?

Sie sollten Warnungen dieser Regel nicht unterdrücken, da Laufzeitausnahmen oder unerwartetes Verhalten (leere Sequenzen) auftreten können.