CA2021: 互換性のない型を指定して Enumerable.Cast<T> または Enumerable.OfType<T> を呼び出さない
プロパティ | 値 |
---|---|
ルール ID | CA2021 |
Title | 互換性のない型を指定して Enumerable.Cast<T> または Enumerable.OfType<T> を呼び出さない |
カテゴリ | 信頼性 |
修正が中断ありか中断なしか | あり |
.NET 9 では既定で有効 | 警告として |
原因
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)
どのようなときに警告を抑制するか
実行時の例外または予期しない動作 (空のシーケンス) が発生するため、この規則の警告は非表示にしないでください。
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET