Перечислители должны быть строго типизированы
Обновлен: Ноябрь 2007
TypeName |
EnumeratorsShouldBeStronglyTyped |
CheckId |
CA1038 |
Категория |
Microsoft.Design |
Критическое изменение |
Критическое изменение |
Причина
Открытый или защищенный тип реализует System.Collections.IEnumerator, но не предоставляет версию свойства 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);
}
}
}
Связанные правила
В составе реализаций ICollection есть члены со строгим типом
Списки обладают строгой типизацией
См. также
Ссылки
System.Collections.IEnumerator
System.Collections.CollectionBase