Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| 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 10 | 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:
- Pemeran generik yang digunakan oleh urutan yang Cast<TResult>(IEnumerable) dikembalikan dengan InvalidCastException melemparkan pada runtime pada elemen jenis yang tidak kompatibel.
- Pemeriksaan jenis generik yang digunakan oleh OfType<TResult>(IEnumerable) tidak akan berhasil dengan elemen jenis yang tidak kompatibel, menghasilkan urutan kosong.
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 runtime atau perilaku tak terduga (urutan kosong).