CA2021: Uyumsuz türlerle Enumerable.Cast<T> veya Enumerable.OfType<T> çağrılmayın
Özellik | Değer |
---|---|
Kural Kimliği | CA2021 |
Başlık | Uyumlu olmayan türleri çağırmayın Enumerable.Cast<T> veya Enumerable.OfType<T> |
Kategori | Güvenilirlik |
Hataya neden olan veya bozulmayan düzeltme | Yeni |
.NET 8'de varsayılan olarak etkin | Uyarı olarak |
Neden
çağrısı Enumerable.Cast<TResult>(IEnumerable) veya Enumerable.OfType<TResult>(IEnumerable) giriş koleksiyonunun türüyle uyumlu olmayan bir tür parametresi belirtir.
Kural açıklaması
Enumerable.Cast<TResult>(IEnumerable) ve Enumerable.OfType<TResult>(IEnumerable) beklenen sonucu elde etmek için uyumlu türler gerektirir:
- tarafından Cast<TResult>(IEnumerable) döndürülen dizi tarafından kullanılan genel tür ataması, uyumsuz türlerdeki öğeler üzerinde çalışma zamanında bir InvalidCastException oluşturur.
- tarafından OfType<TResult>(IEnumerable) kullanılan genel tür denetimi, uyumsuz türlerin öğeleriyle başarılı olmaz ve boş bir diziyle sonuçlanır.
Genel türlerde genişletme ve kullanıcı tanımlı dönüştürmeler desteklenmez.
İhlalleri düzeltme
ve OfType<TResult>(IEnumerable)türü parametresi Cast<TResult>(IEnumerable) için uyumlu bir tür kullanın.
Örnek
Aşağıdaki kod parçacığı ihlalleri gösterir:
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)
Aşağıdaki kod parçacığı düzeltmeleri gösterir:
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)
Uyarıların ne zaman bastırılması gerekiyor?
Çalışma zamanı özel durumları veya beklenmeyen davranışlarla (boş diziler) karşılaşabileceğiniz için bu kuraldan gelen uyarıları gizlememelisiniz.