CA1039: Listy są silnie typizowane
Pozycja | Wartość |
---|---|
Ruleid | CA1039 |
Kategoria | Microsoft.Design |
Zmiana powodująca niezgodność | Kluczowa |
Przyczyna
Typ publiczny lub chroniony implementuje System.Collections.IList , ale nie zapewnia silnie typizowanej metody dla co najmniej jednej z następujących metod:
IList.Item
Ilist.add
Ilist.contains
IList.IndexOf
Ilist.insert
Ilist.remove
Uwaga
Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.
Opis reguły
Ta reguła wymaga IList implementacji, aby zapewnić silnie typizowane elementy członkowskie, aby użytkownicy nie byli zobowiązani do rzutowania argumentów do System.Object typu, gdy korzystają z funkcji udostępnianych przez interfejs. Interfejs IList jest implementowany przez kolekcje obiektów, do których można uzyskać dostęp za pomocą indeksu. Ta reguła zakłada, że typ implementujący IList zarządza kolekcją wystąpień typu, który jest silniejszy niż Object.
IList implementuje System.Collections.ICollection interfejsy i System.Collections.IEnumerable . W przypadku implementacji IListnależy podać wymagane silnie typizowane elementy członkowskie dla elementu ICollection. Jeśli obiekty w kolekcji rozszerzają System.ValueTypeelement , należy podać silnie typizowane elementy członkowskie GetEnumerator , aby uniknąć spadku wydajności spowodowanej przez boks; nie jest to wymagane, gdy obiekty kolekcji są typem referencyjnym.
Aby zachować zgodność z tą regułą, należy jawnie zaimplementować elementy członkowskie interfejsu przy użyciu nazw w postaci InterfaceName.InterfaceMemberName, takich jak Add. Jawne elementy członkowskie interfejsu używają typów danych zadeklarowanych przez interfejs. Zaimplementuj silnie typizowane elementy członkowskie przy użyciu nazwy elementu członkowskiego interfejsu, na przykład Add
. Zadeklaruj silnie typizowane elementy członkowskie jako publiczne i zadeklaruj parametry i zwracane wartości, które mają być silnego typu zarządzanego przez kolekcję. Silne typy zastępują słabsze typy, takie jak Object i Array , które są deklarowane przez interfejs.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, jawnie zaimplementuj IList elementy członkowskie i podaj silnie typizowane alternatywy dla elementów członkowskich, które zostały wcześniej zanotowane. Aby uzyskać kod, który poprawnie implementuje IList interfejs i udostępnia wymagane silnie typizowane elementy członkowskie, zobacz poniższy przykład.
Kiedy pomijać ostrzeżenia
Pomiń ostrzeżenie z tej reguły podczas implementowania nowej kolekcji opartej na obiektach, takiej jak połączona lista, gdzie typy rozszerzające nową kolekcję określają silny typ. Te typy powinny być zgodne z tą regułą i uwidaczniać silnie typizowane elementy członkowskie.
Przykład
W poniższym przykładzie typ rozszerza System.Collections.CollectionBasetyp YourType
, ponieważ wszystkie silnie typizowane kolekcje powinny. CollectionBase Udostępnia jawną implementację interfejsu IList . W związku z tym należy podać tylko silnie typizowane elementy członkowskie dla IList i ICollection.
using System;
using System.Collections;
namespace DesignLibrary
{
public class YourType
{
// Implementation for your strong type goes here.
public YourType() {}
}
public class YourTypeCollection : CollectionBase
{
// Provide the strongly typed members for IList.
public YourType this[int index]
{
get
{
return (YourType) ((IList)this)[index];
}
set
{
((IList)this)[index] = value;
}
}
public int Add(YourType value)
{
return ((IList)this).Add ((object) value);
}
public bool Contains(YourType value)
{
return ((IList)this).Contains((object) value);
}
public void Insert(int index, YourType value)
{
((IList)this).Insert(index, (object) value);
}
public void Remove(YourType value)
{
((IList)this).Remove((object) value);
}
public int IndexOf(YourType value)
{
return ((IList)this).IndexOf((object) value);
}
// Provide the strongly typed member for ICollection.
public void CopyTo(YourType[] array, int index)
{
((ICollection)this).CopyTo(array, index);
}
}
}
Powiązane reguły
CA1035: Implementacje interfejsu ICollection mają silnie typizowane składowe
CA1038: Moduły wyliczające powinny być silnie typizowane
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla