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 9 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.