CA1039: リストは厳密に型指定されています
TypeName |
ListsAreStronglyTyped |
CheckId |
CA1039 |
分類 |
Microsoft.Design |
互換性に影響する変更点 |
あり |
原因
パブリック型またはプロテクト型で IList が実装されていますが、次の 1 つ以上の対象に厳密に型指定されたメソッドがありません。
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
規則の説明
この規則では、IList で厳密に型指定されたメンバーを実装する必要があります。これは、ユーザーがインターフェイスに備わっている機能を使用するときに、必ずしも引数を Object 型にキャストするとは限らないためです。IList インターフェイスは、インデックスからアクセスできるオブジェクトのコレクションで実装されます。この規則では、IList を実装する型でこの処理を行って、Object よりも厳密な型のインスタンス コレクションを管理すると想定しています。
IList は、ICollection インターフェイスと IEnumerable インターフェイスを実装します。IList を実装する場合、ICollection に必要な厳密に型指定されたメンバーを提示します。コレクション内のオブジェクトで ValueType を拡張する場合、GetEnumerator に厳密に型指定したメンバーを提示します。これによって、ボックス化によるパフォーマンスの低下を防ぐことができます。コレクションのオブジェクトが参照型である場合、この処理は必要ありません。
この規則を順守するには、InterfaceName.InterfaceMemberName の形式の名前 (たとえば Add) で、インターフェイスのメンバーを明示的に実装します。明示的なインターフェイス メンバーでは、インターフェイスで宣言されたデータ型を使用します。Add などのインターフェイス メンバー名を使用して、厳密に型指定されたメンバーを実装します。厳密に型指定されたメンバーをパブリックと宣言し、パラメーターと戻り値は、コレクションで管理される厳密な型になるように宣言します。インターフェイスで宣言されている Object や Array などの弱い型は、厳密な型で置換されます。
違反の修正方法
この規則違反を修正するには、IList メンバーを明示的に実装し、上記のメンバーを厳密に型指定したメンバーで置き換えます。IList インターフェイスを適切に実装し、必要な厳密に型指定されたメンバーを提示したコードについては、以下の例を参照してください。
警告を抑制する状況
リンクされるリストは、新しいコレクションを拡張する型によって厳密な型が決まります。このように新しいオブジェクト ベースのコレクションを実装する場合は、この規則による警告を抑制します。このような型では、この規則を順守し、厳密に型指定されたメンバーを公開します。
使用例
次の例では、型 YourType によって CollectionBase を拡張し、すべてのコレクションが厳密に型指定されます。CollectionBase は、IList インターフェイスを明示的に実装しています。そのため、IList と ICollection に対して、厳密に型指定されたメンバーのみを提示する必要があります。
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: 列挙子は厳密に型指定されていなければなりません