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