CA1035: в составе реализаций ICollection есть строго типизированные элементы

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

Причина

Общедоступный или защищенный тип реализуетSystem.Collections.ICollection, но не предоставляет строго типизированный метод.System.Collections.ICollection.CopyTo Строго типизированная версия CopyTo должна принимать два параметра и не может иметь System.Array массив в System.Object качестве первого параметра.

Примечание.

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

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

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

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

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

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

Чтобы устранить нарушение этого правила, явным образом реализуйте член интерфейса (объявите его как CopyTo). Добавьте общедоступный строго типизированный член, объявленный как CopyToи укажите строго типизированный массив в качестве первого параметра.

Когда лучше отключить предупреждения

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

Пример

В следующем примере показан правильный способ реализации ICollection.

using System;
using System.Collections;
namespace DesignLibrary
{
   
   public class ExceptionCollection : ICollection
   {   
      private ArrayList data;

      ExceptionCollection()
      {
         data = new ArrayList();
      }

      // Provide the explicit interface member for ICollection.
      void ICollection.CopyTo(Array array, int index)
      {
         data.CopyTo(array, index);
      }

      // Provide the strongly typed member for ICollection.
      public void CopyTo(Exception[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }
   
      // Implement the rest of the ICollection members.
      public int Count
      {
        get 
        {
           return data.Count;
        }
      }

      public object SyncRoot
      {
         get 
        {
           return this; 
        }
      }

      public bool IsSynchronized
      {
         get 
         {
            return false; 
         }
      }

      // The IEnumerable interface is implemented by ICollection.
      // Because the type underlying this collection is a reference type,
      // you do not need a strongly typed version of GetEnumerator.

      public IEnumerator GetEnumerator()
      {
         return data.GetEnumerator();
      }
   }
}

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

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

См. также