CA2021: 互換性のない型を指定して Enumerable.Cast<T> または Enumerable.OfType<T> を呼び出さない

プロパティ
ルール ID CA2021
Title 互換性のない型を指定して 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)

どのようなときに警告を抑制するか

実行時の例外または予期しない動作 (空のシーケンス) が発生するため、この規則の警告は非表示にしないでください。