| 屬性 | 值 |
|---|---|
| 規則識別碼 | CA2021 |
| 職稱 | 請勿呼叫 Enumerable.Cast<T> 或 Enumerable.OfType<T> 與不相容的類型 |
| 類別 | 可靠性 |
| 修正程式是中斷或非中斷 | 中斷 |
| 在 .NET 10 中預設啟用 | 作為警告 |
原因
呼叫 Enumerable.Cast<TResult>(IEnumerable) 或 Enumerable.OfType<TResult>(IEnumerable) 指定與輸入集合類型不相容的類型參數。
檔案描述
Enumerable.Cast<TResult>(IEnumerable) 和 Enumerable.OfType<TResult>(IEnumerable) 需要相容的類型,才能產生預期的結果:
- 序列使用的Cast<TResult>(IEnumerable) 泛型轉型在執行時,會對不相容型態的元素拋出InvalidCastException。
- 所使用的 OfType<TResult>(IEnumerable) 泛型型別檢查不會成功與不相容類型的元素,導致空序列。
泛型型別不支援擴大和使用者定義轉換。
如何修正違規
針對和Cast<TResult>(IEnumerable)的類型參數OfType<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)
隱藏警告的時機
你不應該忽略這條規則的警告,因為你可能會遇到執行時例外或意外行為(例如空的序列)。