Поделиться через


CA1039: списки обладают строгой типизацией

TypeName

ListsAreStronglyTyped

CheckId

CA1039

Категория

Microsoft.Design

Критическое изменение

Критическое изменение

Причина

Открытый или защищенный тип реализует System.Collections.IList, но не предоставляет метод со строгой типизацией для одного или нескольких следующих объектов:

  • IList.Item

  • IList.Add

  • IList.Contains

  • IList.IndexOf

  • IList.Insert

  • IList.Remove

Описание правила

Это правило требует, чтобы реализации IList предоставляли строго типизированные члены, поскольку тогда пользователям не придется приводить аргументы к типу System.Object при использовании функциональных возможностей интерфейса. Интерфейс IList реализуется коллекциями объектов, доступ к которым осуществляется посредством индекса. В этом правиле предполагается, что тип, реализующий IList, делает это для управления коллекцией экземпляров типа, более строгого, чем Object.

IList реализует интерфейсы System.Collections.ICollection и System.Collections.IEnumerable. При реализации IList нужно предоставить необходимые члены со строгой типизацией для ICollection. Если объекты в коллекции расширяют System.ValueType, нужно предоставить член со строгой типизацией для GetEnumerator, чтобы избежать снижения производительности, вызванной упаковкой. Этого не требуется, если объекты коллекции являются ссылочным типом.

Для выполнения этого правила реализуйте члены интерфейса явным образом, используя имена в форме имя_интерфейса.имя_члена_интерфейса, например Add. Явно реализованные члены интерфейса используют типы данных, объявленные в интерфейсе. Типобезопасные члены следует реализовывать, используя имена членов интерфейса, например Add. Объявите типобезопасные члены как открытые, а параметры и возвращаемые значения объявите принадлежащими строгому типу, управляемому коллекцией. Строгие типы заменяют более слабые типы, такие как Object и Array, объявленные в интерфейсе.

Устранение нарушений

Чтобы устранить нарушение данного правила, следует явным образом реализовать члены IList и обеспечить альтернативные члены со строгой типизацией вместо указанных ранее членов. Пример кода с правильной реализацией интерфейса IList и с необходимыми элементами со строгой типизацией см. ниже.

Отключение предупреждений

Предупреждения этого правила следует отключать при реализации новой коллекции на базе объектов, например связанного списка, где типы, расширяющие новую коллекцию, определяют строгий тип. Эти типы должны удовлетворять данному правилу и предоставлять типобезопасные члены.

Пример

В следующем примере тип YourType расширяет System.Collections.CollectionBase, как должны делать все коллекции со строгой типизацией. Обратите внимание, что CollectionBase предоставляет явную реализацию интерфейс IList. Таким образом, необходимо только указать строго типизированные члены для IList и 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: в составе реализаций ICollection есть строго типизированные элементы

CA1038: перечислители должны быть строго типизированы

См. также

Ссылки

System.Collections.CollectionBase

System.Collections.ICollection

System.Collections.IEnumerable

System.Collections.IList

System.Object