CA1038: 列挙子は厳密に型指定されていなければなりません
TypeName |
EnumeratorsShouldBeStronglyTyped |
CheckId |
CA1038 |
分類 |
Microsoft.Design |
互換性に影響する変更点 |
あり |
原因
パブリック型またはプロテクト型で、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 の実装は、厳密に型指定されたメンバーを含んでいます