CA1035: ICollection の実装は、厳密に型指定されたメンバーを含んでいます

TypeName

ICollectionImplementationsHaveStronglyTypedMembers

CheckId

CA1035

カテゴリ

Microsoft.Design

互換性に影響する変更点

あり

原因

パブリック型またはプロテクト型で、System.Collections.ICollection を実装していますが、厳密に型指定されたメソッドが ICollection.CopyTo にありません。 厳密に型指定されたバージョンの CopyTo では、2 つのパラメーターを受け入れる必要があります。また、最初のパラメーターに System.Array または System.Object の配列を指定することはできません。

規則の説明

この規則では、ICollection で厳密に型指定されたメンバーを実装する必要があります。これは、ユーザーがインターフェイスに備わっている機能を使用するときに、必ずしも引数を Object 型にキャストするとは限らないためです。 この規則では、ICollection を実装する型でこの処理を行って、Object よりも厳密な型のインスタンス コレクションを管理すると想定しています。

ICollection では、System.Collections.IEnumerable インターフェイスを実装します。 コレクション内のオブジェクトで System.ValueType を拡張する場合、GetEnumerator に厳密に型指定したメンバーを提示します。これによって、ボックス化によるパフォーマンスの低下を防ぐことができます。 コレクションのオブジェクトが参照型である場合、この処理は必要ありません。

厳密に型指定されたバージョンのインターフェイス メンバーを実装するには、明示的に InterfaceName.InterfaceMemberName という形式の名前を使用して、インターフェイス メンバーを実装します (たとえば CopyTo)。 明示的なインターフェイス メンバーでは、インターフェイスで宣言されたデータ型を使用します。 CopyTo などのインターフェイス メンバー名を使用して、厳密に型指定されたメンバーを実装します。 厳密に型指定されたメンバーをパブリックと宣言し、パラメーターと戻り値は、コレクションで管理される厳密な型になるように宣言します。 インターフェイスで宣言されている ObjectArray などの弱い型は、厳密な型で置換されます。

違反の修正方法

この規則違反を修正するには、インターフェイス メンバーを明示的に実装します (CopyTo と宣言します)。 厳密に型指定されたパブリック メンバーを追加し、CopyTo と宣言して、厳密に型指定された配列を最初のパラメーターに使用します。

警告を抑制する状況

バイナリ ツリーは、新しいコレクションを拡張する型によって厳密な型が決まります。このように新しいオブジェクト ベースのコレクションを実装するときは、この規則による警告を抑制します。 このような型では、この規則を順守し、厳密に型指定されたメンバーを公開します。

使用例

ICollection の適切な実装例を次に示します。

using System;
using System.Collections;
namespace DesignLibrary
{

   public class ExceptionCollection : ICollection
   {   
      private 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.
      // Because the type underlying this collection is a reference type,
      // you do not need a strongly typed version of GetEnumerator.

      public IEnumerator GetEnumerator()
      {
         return data.GetEnumerator();
      }
   }
}

関連規則

CA1038: 列挙子は厳密に型指定されていなければなりません

CA1039: リストは厳密に型指定されています

参照

参照

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object