CA1038: перечислители должны быть строго типизированы
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);
}
}
}
Связанные правила
CA1035: в составе реализаций ICollection есть строго типизированные элементы
CA1039: списки обладают строгой типизацией
См. также
Ссылки
System.Collections.IEnumerator
System.Collections.CollectionBase