Bagikan melalui


CA2021: Jangan panggil Enumerable.Cast<T> atau Enumerable.OfType<T> dengan jenis yang tidak kompatibel

Properti Nilai
ID Aturan CA2021
Judul Jangan memanggil Enumerable.Cast<T> atau Enumerable.OfType<T> dengan jenis yang tidak kompatibel
Golongan Keandalan
Perbaikan bersifat disruptif atau non-disruptif Merusak
Diaktifkan secara default di .NET 8 Sebagai peringatan

Penyebab

Panggilan ke Enumerable.Cast<TResult>(IEnumerable) atau Enumerable.OfType<TResult>(IEnumerable) menentukan parameter jenis yang tidak kompatibel dengan jenis koleksi input.

Deskripsi aturan

Enumerable.Cast<TResult>(IEnumerable) dan Enumerable.OfType<TResult>(IEnumerable) memerlukan jenis yang kompatibel untuk menghasilkan hasil yang diharapkan:

Memperlebar dan konversi yang ditentukan pengguna tidak didukung dengan jenis generik.

Cara memperbaiki pelanggaran

Gunakan jenis yang kompatibel untuk parameter Cast<TResult>(IEnumerable) jenis dan OfType<TResult>(IEnumerable).

Contoh

Cuplikan kode berikut menunjukkan pelanggaran:

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)

Cuplikan kode berikut menunjukkan perbaikan:

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)

Kapan harus menekan peringatan

Anda tidak boleh menyembunyikan peringatan dari aturan ini, karena Anda akan mengalami pengecualian run-time atau perilaku tak terduga (urutan kosong).