CA1038: Enumeradores devem ser fortemente tipados

TypeName

EnumeratorsShouldBeStronglyTyped

CheckId

CA1038

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Quebrando

Causa

Um tipo de público ou protegido implementa System.Collections.IEnumerator mas não fornece uma versão com rigidez de tipos do IEnumerator.Current propriedade. Tipos derivados de tipos a seguir estão isentos esta regra:

Descrição da regra

Esta regra requer IEnumerator implementações também fornecer uma versão com rigidez de tipos a Current propriedade para que os usuários não precisam converter o valor de retorno para o tipo de alta segurança quando usarem a funcionalidade fornecida pela interface. Esta regra pressupõe que o tipo que implementa IEnumerator contém uma coleção de instâncias de um tipo mais forte do que Object.

Como corrigir violações

Para corrigir uma violação desta regra, implementar explicitamente a propriedade de interface (declará-lo como IEnumerator.Current). Adicionar uma versão pública de fortemente tipada da propriedade, declarada como Current, e ainda retornar um objeto com rigidez de tipos.

Quando suprimir avisos

Suprimi um aviso da regra quando você implementa um enumerador baseada em objeto para uso com uma coleção baseada em objeto, como, por exemplo, uma árvore binária. Tipos de estendem a nova coleção serão definir o enumerador com rigidez de tipos e expor a propriedade com rigidez de tipos.

Exemplo

O exemplo a seguir demonstra a maneira correta de implementar fortemente tipada IEnumerator tipo.

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

Regras relacionadas

CA1035: Implementações de ICollection com rigidez de tipos membros

CA1039: Listas são fortemente tipadas

Consulte também

Referência

System.Collections.IEnumerator

System.Collections.CollectionBase

System.Collections.DictionaryBase

System.Collections.ReadOnlyCollectionBase