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 8 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:

  • Die generische Umwandlung, die von der von Cast<TResult>(IEnumerable) zurückgegebenen Sequenz zurückgegeben wird, löst zur Laufzeit für Elemente inkompatibler Typen eine InvalidCastException aus.
  • Die generische Typüberprüfung, die von OfType<TResult>(IEnumerable) verwendet wird, ist mit Elementen inkompatibler Typen nicht erfolgreich, was zu einer leeren Sequenz führt.

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 von dieser Regel nicht unterdrücken, da entweder Laufzeit-Ausnahmen oder unerwartetes Verhalten (leere Sequenzen) auftreten.