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) 需要相容的類型,才能產生預期的結果:
- 所傳回序列所使用的泛型轉換,會在執行時間對不相容類型的專案擲回 Cast<TResult>(IEnumerable)InvalidCastException 。
- 所使用的 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)
隱藏警告的時機
您不應該隱藏此規則的警告,因為您將遇到運行時例外狀況或非預期的行為(空序列)。