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:
- Pemeran generik yang digunakan oleh urutan yang dikembalikan dengan Cast<TResult>(IEnumerable) melemparkan InvalidCastException pada waktu proses 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 run-time atau perilaku tak terduga (urutan kosong).
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk