CA2021:請勿呼叫具有不相容類型的 Enumerable.Cast < T > 或 Enumerable.OfType < T >

屬性
規則識別碼 CA2021
標題 請勿呼叫 Enumerable.Cast<T>Enumerable.OfType<T> 與不相容的類型
類別 可靠性
修正程式是中斷或非中斷 中斷
預設在 .NET 8 中啟用 作為警告

原因

呼叫 Enumerable.Cast<TResult>(IEnumerable)Enumerable.OfType<TResult>(IEnumerable) 指定與輸入集合類型不相容的類型參數。

檔案描述

Enumerable.Cast<TResult>(IEnumerable)Enumerable.OfType<TResult>(IEnumerable) 需要相容的類型,才能產生預期的結果:

泛型型別不支援擴大和使用者定義轉換。

如何修正違規

針對 和 OfType<TResult>(IEnumerable) 的類型參數 Cast<TResult>(IEnumerable) 使用相容的型別。

範例

下列程式碼片段顯示違規:

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)

下列程式碼片段顯示修正:

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)

隱藏警告的時機

您不應該隱藏此規則的警告,因為您將遇到運行時例外狀況或非預期的行為(空序列)。