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

Товар Значение
Идентификатор правила CA1039
Категория Microsoft.Design
Критическое изменение Критическое

Причина

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

  • IList.Item

  • IList.Add

  • IList.Contains

  • IList.IndexOf

  • IList.Insert

  • IList.Remove

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

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

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

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

Чтобы соответствовать этому правилу, реализуйте элементы интерфейса явным образом с помощью имен в формате InterfaceName.InterfaceMemberName, например 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: перечислители должны быть строго типизированы

См. также