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

System.Collections.DictionaryBase

System.Collections.ReadOnlyCollectionBase