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

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

Причина

Общедоступный или защищенный тип реализует System.Collections.IEnumerator , но не предоставляет строго типизированную версию System.Collections.IEnumerator.Current свойства. Типы, производные от следующих типов, исключаются из этого правила:

Примечание.

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

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

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

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

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

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

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

Пример

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

using System;
using System.Collections;
namespace DesignLibrary
{
   // The ExceptionEnumerator class implements a strongly typed enumerator 
   // for the ExceptionCollection type.

   public class ExceptionEnumerator: IEnumerator
   {
      private IEnumerator myCollectionEnumerator;

      private ExceptionEnumerator () {}

      public ExceptionEnumerator(ExceptionCollection collection)
      {
         myCollectionEnumerator = collection.data.GetEnumerator();
      }

      // Implement the IEnumerator interface member explicitly.
      object IEnumerator.Current
      {
         get 
         {
            return myCollectionEnumerator.Current;
         }
      }

      // Implement the strongly typed member.
      public Exception Current
      {
         get 
         {
            return (Exception) myCollectionEnumerator.Current;
         }
      }

      // Implement the remaining IEnumerator members.
      public bool MoveNext ()
      {
         return myCollectionEnumerator.MoveNext();
      }

      public void Reset ()
      {
         myCollectionEnumerator.Reset();
      }
   }

   public class ExceptionCollection : ICollection
   {   
      internal 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.
      IEnumerator IEnumerable.GetEnumerator()
      {
         return new ExceptionEnumerator(this);
      }

      public ExceptionEnumerator GetEnumerator()
      {
         return new ExceptionEnumerator(this);
      }
   }
}

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

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

См. также