CA1038: перечислители должны быть строго типизированы
Товар | Значение |
---|---|
Идентификатор правила | CA1038 |
Категория | Microsoft.Design |
Критическое изменение | Критическое |
Причина
Общедоступный или защищенный тип реализует System.Collections.IEnumerator , но не предоставляет строго типизированную версию System.Collections.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: списки обладают строгой типизацией
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по