CA2021:不要使用不兼容类型调用 Enumerable.Cast<T> 或 Enumerable.OfType<T>
属性 | 值 |
---|---|
规则 ID | 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) 使用的泛型类型检查将失败,从而导致出现空序列。
泛型类型不支持扩大转换和用户定义的转换。
如何解决冲突
将兼容类型用于 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)
何时禁止显示警告
不得抑制来自此规则的警告,因为你会遇到运行时异常或意外行为(空序列)。