CA2021: Roep Enumerable.Cast<T> of Enumerable.OfType<T> met niet-compatibele typen niet aan
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2021 |
Titel | Niet aanroepen Enumerable.Cast<T> of Enumerable.OfType<T> met niet-compatibele typen |
Categorie | Betrouwbaarheid |
Oplossing is brekend of niet-brekend | Breken |
Standaard ingeschakeld in .NET 9 | Als waarschuwing |
Oorzaak
Een aanroep naar Enumerable.Cast<TResult>(IEnumerable) of Enumerable.OfType<TResult>(IEnumerable) geeft een typeparameter op die niet compatibel is met het type invoerverzameling.
Beschrijving van regel
Enumerable.Cast<TResult>(IEnumerable) en Enumerable.OfType<TResult>(IEnumerable) vereist compatibele typen om het verwachte resultaat te produceren:
- De algemene cast die wordt gebruikt door de reeks die wordt geretourneerd door Cast<TResult>(IEnumerable) een InvalidCastException runtime genereert op elementen van niet-compatibele typen.
- De algemene typecontrole die wordt gebruikt, OfType<TResult>(IEnumerable) slaagt niet met elementen van niet-compatibele typen, wat resulteert in een lege reeks.
Widening en door de gebruiker gedefinieerde conversies worden niet ondersteund met algemene typen.
Schendingen oplossen
Gebruik een compatibel type voor de typeparameter en Cast<TResult>(IEnumerable) OfType<TResult>(IEnumerable).
Opmerking
In het volgende codefragment worden schendingen weergegeven:
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)
In het volgende codefragment ziet u de oplossingen:
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)
Wanneer waarschuwingen onderdrukken
U moet waarschuwingen van deze regel niet onderdrukken, omdat u runtime-uitzonderingen of onverwacht gedrag ondervindt (lege reeksen).