CA1038: Enumeratoren sollten eine starke Typisierung aufweisen

TypeName

EnumeratorsShouldBeStronglyTyped

CheckId

CA1038

Kategorie (Category)

Microsoft.Design

Unterbrechende Änderung

Breaking

Ursache

Ein öffentlicher oder geschützter Typ implementiert IEnumerator, gibt jedoch keine stark typisierte Version der IEnumerator.Current-Eigenschaft an.Typen, die von den folgenden Typen abgeleitet sind, sind von dieser Regel ausgenommen:

Regelbeschreibung

Nach dieser Regel müssen IEnumerator-Implementierungen für die Current-Eigenschaft auch eine Version mit starker Typisierung angeben, damit die Benutzer den Rückgabewert nicht in den starken Typ umwandeln müssen, wenn sie die durch die Schnittstelle zur Verfügung gestellten Funktionen verwenden.Diese Regel setzt voraus, dass der Typ, der IEnumerator implementiert, eine Auflistung von Instanzen eines Typs enthält, der stärker ist als Object.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie die Schnittstelleneigenschaft explizit (deklarieren Sie sie als IEnumerator.Current).Fügen Sie eine öffentliche stark typisierte Version der Eigenschaft hinzu, die als Current deklariert ist, und lassen Sie diese ein stark typisiertes Objekt zurückgeben.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel, wenn Sie einen objektbasierten Enumerator implementieren, der zur Verwendung mit einer objektbasierten Auflistung, z. B. einer binären Struktur, vorgesehen ist.Typen, die die neue Auflistung erweitern, definieren den stark typisierten Enumerator und stellen die Eigenschaft mit starker Typisierung zur Verfügung.

Beispiel

Im folgenden Beispiel wird das richtige Verfahren zur Implementierung eines IEnumerator-Typs mit starker Typisierung dargestellt.

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);
      }
   }
}

Verwandte Regeln

CA1035: ICollection-Implementierungen weisen Member mit starker Typisierung auf

CA1039: Listen weisen eine starke Typisierung auf

Siehe auch

Referenz

IEnumerator

CollectionBase

DictionaryBase

ReadOnlyCollectionBase