Share via


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

Item [値]
規則 ID CA1039
カテゴリ Microsoft.Design
互換性に影響する変更点 あり

原因

パブリック型またはプロテクト型では System.Collections.IList が実装されますが、次の厳密に型指定されたメソッドの 1 つ以上は提供されません。

  • IList.Item

  • IList.Add

  • IList.Contains

  • IList.IndexOf

  • IList.Insert

  • IList.Remove

Note

このルールは非推奨とされました。 詳細については、「非推奨の規則」を参照してください。

規則の説明

この規則は、IList で厳密に型指定されたメンバーを実装することを必須とするものです。これは、ユーザーがこのインターフェイスに備わっている機能を使用する際に、引数を System.Object 型にキャストしなくてもよいようにするためです。 IList インターフェイスは、インデックスによってアクセスできるオブジェクトのコレクションによって実装されます。 この規則では、IList を実装する型で、Object よりも厳密な型のインスタンス コレクションが管理されることを前提としています。

IList では、System.Collections.ICollection および System.Collections.IEnumerable インターフェイスが実装されます。 IList を実装する場合は、ICollection に必要な、厳密に型指定されたメンバーを指定する必要があります。 コレクション内のオブジェクトで System.ValueType を拡張する場合は、ボックス化によって発生するパフォーマンスの低下を回避するために、GetEnumerator の厳密に型指定されたメンバーを提供する必要があります。コレクションのオブジェクトが参照型である場合、これは必要ありません。

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

違反の修正方法

この規則違反を修正するには、IList メンバーを明示的に実装し、先に挙げたメンバーについて、厳密に型指定された代替手段を提供します。 IList インターフェイスを正しく実装し、必要な厳密に型指定されたメンバーを提供するコードについては、次の例を参照してください。

どのようなときに警告を抑制するか

オブジェクト ベースの新しいコレクション (リンク リストなど) を実装する場合は、この新しいコレクションを拡張する型によって厳密な型が決まるため、この規則による警告を抑制してください。 これらの型では、この規則に準拠し、厳密に型指定されたメンバーを公開する必要があります。

次の例では、型 YourTypeSystem.Collections.CollectionBase を拡張しています。これは、厳密に型指定されたすべてのコレクションで必要です。 CollectionBase では、IList インターフェイスの明示的な実装が提供されます。 したがって、指定する必要があるのは、IListICollection の厳密に型指定されたメンバーのみとなります。

using System;
using System.Collections;
namespace DesignLibrary
{
   public class YourType
   {
      // Implementation for your strong type goes here.
      
      public YourType() {}
   }

   public class YourTypeCollection : CollectionBase
   {
      // Provide the strongly typed members for IList.
      public YourType this[int index]
      {
         get 
         {
            return (YourType) ((IList)this)[index];
         }
         set 
         {
            ((IList)this)[index] =  value;
         }
      }

      public int Add(YourType value)
      {
         return ((IList)this).Add ((object) value);
      }

      public bool Contains(YourType value) 
      {
         return ((IList)this).Contains((object) value);
      }

      public void Insert(int index, YourType value) 
      {
         ((IList)this).Insert(index, (object) value);
      }

      public void Remove(YourType value) 
      {
         ((IList)this).Remove((object) value);
      }

      public int IndexOf(YourType value) 
      {
         return ((IList)this).IndexOf((object) value);
      }

      // Provide the strongly typed member for ICollection.

      public void CopyTo(YourType[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }
   }
}

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

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

関連項目