Udostępnij za pośrednictwem


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);
      }
   }
}

CA1035: Implementacje interfejsu ICollection mają silnie typizowane składowe

CA1038: Moduły wyliczające powinny być silnie typizowane

Zobacz też