Delen via


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

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