Compartilhar via


CA1038: os enumeradores devem ser fortemente tipados

TypeName

EnumeratorsShouldBeStronglyTyped

CheckId

CA1038

Categoria

Microsoft.Design

Alteração Significativa

Quebra

Causa

Um público ou um implementa protegidos IEnumerator do tipo mas não fornecem uma versão com rigidez da propriedade de IEnumerator.Current .Tipos que é derivada dos seguintes tipos é isento dessa regra:

Descrição da Regra

Essa regra requer implementações de IEnumerator fornecer também uma versão com rigidez da propriedade de Current de forma que usuários não sejam necessários para converter o valor de retorno no tipo forte quando usarem a funcionalidade fornecida pela interface.Esta regra assumirá que o tipo que implementa IEnumerator contém uma coleção de instâncias de um tipo que é mais segura que Object.

Como Corrigir Violações

Para corrigir uma violação desta regra, implemente a propriedade da interface explicitamente (a declarar como IEnumerator.Current).Adicionar uma versão com rigidez do utilitário a propriedade, declarada como Current, e mande-a retornar um objeto com rigidez.

Quando Suprimir Alertas

Suprima um aviso desta regra quando você implementa um enumerador baseado em objeto para uso com uma coleção de objetos com base, como uma árvore binária.Tipos que estende a nova coleção definirá o enumerador com rigidez e expõe a propriedade com rigidez de tipos.

Exemplo

O exemplo a seguir demonstra a forma correta da implementação de um tipo com rigidez de 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);
      }
   }
}

Regras Relacionadas

CA1035: as implementações de ICollection têm membros fortemente tipados

CA1039: as listas são fortemente tipadas

Consulte também

Referência

IEnumerator

CollectionBase

DictionaryBase

ReadOnlyCollectionBase