次の方法で共有


CA1010: コレクションは、ジェネリック インターフェイスを実装しなければなりません

TypeName

CollectionsShouldImplementGenericInterface

CheckId

CA1010

分類

Microsoft.Design

互換性に影響する変更点

なし

原因

外部から参照可能な型は、IEnumerable インターフェイスを実装していますが、IEnumerable インターフェイスを実装していません。また、包含アセンブリが .NET Framework 2.0 を対象としています。この規則は、IDictionary を実装する型を無視します。

規則の説明

コレクションの操作性を拡充するために、ジェネリック コレクション インターフェイスの 1 つを実装します。次に、コレクションを使用して、次のようなジェネリック コレクション型を設定できます。

違反の修正方法

この規則違反を修正するには、次のジェネリック コレクション インターフェイスの 1 つを実装します。

警告を抑制する状況

この規則による警告を抑制しても安全ですが、コレクションの用途が限定されます。

違反例

説明

この規則に違反する例として、非ジェネリック CollectionBase クラスから派生したクラス (参照型) を次に示します。

コード

using System;
using System.Collections;

namespace Samples
{
    public class Book
    {
        public Book()
        {
        }
    }

    public class BookCollection : CollectionBase
    {
        public BookCollection()
        {
        }

        public void Add(Book value)
        {
            InnerList.Add(value);
        }

        public void Remove(Book value)
        {
            InnerList.Remove(value);
        }

        public void Insert(int index, Book value)
        {
            InnerList.Insert(index, value);
        }

        public Book this[int index]
        {
            get { return (Book)InnerList[index]; }
            set { InnerList[index] = value; }
        }

        public bool Contains(Book value)
        {
            return InnerList.Contains(value);
        }

        public int IndexOf(Book value)
        {
            return InnerList.IndexOf(value);
        }

        public void CopyTo(Book[] array, int arrayIndex)
        {
            InnerList.CopyTo(array, arrayIndex);
        }
    }
}

コメント

この規則違反を修正するには、ジェネリック インターフェイスを実装するか、Collection<T> クラスのように、ジェネリック インターフェイスと非ジェネリック インターフェイスの両方を既に実装している型に基本クラスを変更する必要があります。

基本クラスの変更による修正

説明

コレクションの基本クラスを非ジェネリック CollectionBase クラスからジェネリック Collection<T> (Visual Basic の Collection(Of T)) クラスに変更することによって上記の違反を修正するコード例を次に示します。

コード

using System;
using System.Collections.ObjectModel; 

namespace Samples
{    
    public class Book        
    {               
        public Book()                
        {                
        }        
    }    

    public class BookCollection : Collection<Book>    
    {        
        public BookCollection()        
        {        
        }    
    }
}

コメント

既にリリースされているクラスの基本クラスを変更することは、既存のコンシューマーに対する互換性に影響すると考えられます。

インターフェイスの実装による修正

説明

これらのジェネリック インターフェイス IEnumerable<T>、ICollection<T>、および IList<T> (Visual Basic の IEnumerable(Of T)、ICollection(Of T)、および IList(Of T)) の実装によって上記の違反を修正するコード例を次に示します。

コード

using System;
using System.Collections;
using System.Collections.Generic;

namespace Samples
{
    public class Book
    {
        public Book()
        {
        }
    }

    public class BookCollection : CollectionBase, IList<Book>
    {
        public BookCollection()
        {
        }

        int IList<Book>.IndexOf(Book item)
        {
            return this.List.IndexOf(item);
        }

        void IList<Book>.Insert(int location, Book item)
        {
        }

        Book IList<Book>.this[int index]
        {
            get { return (Book) this.List[index]; }
            set { }
        }

        void ICollection<Book>.Add(Book item)
        {
        }

        bool ICollection<Book>.Contains(Book item)
        {
            return true;
        }

        void ICollection<Book>.CopyTo(Book[] array, int arrayIndex)
        {
        }

        bool ICollection<Book>.IsReadOnly
        {
            get { return false; }
        }

        bool ICollection<Book>.Remove(Book item)
        {
            if (InnerList.Contains(item))
            {
                InnerList.Remove(item);
                return true;
            }
            return false;
        }

        IEnumerator<Book> IEnumerable<Book>.GetEnumerator()
        {
            return new BookCollectionEnumerator(InnerList.GetEnumerator());
        }

        private class BookCollectionEnumerator : IEnumerator<Book>
        {
            private IEnumerator _Enumerator;

            public BookCollectionEnumerator(IEnumerator enumerator)
            {
                _Enumerator = enumerator;
            }

            public Book Current
            {
                get { return (Book)_Enumerator.Current; }
            }

            object IEnumerator.Current
            {
                get { return _Enumerator.Current; }
            }

            public bool MoveNext()
            {
                return _Enumerator.MoveNext();
            }

            public void Reset()
            {
                _Enumerator.Reset();
            }

            public void Dispose()
            {
            }
        }
    }
}

関連規則

CA1005: ジェネリック型でパラメーターを使用しすぎないでください

CA1000: ジェネリック型の静的メンバーを宣言しません

CA1002: ジェネリック リストを公開しません

CA1006: ジェネリック型をメンバー シグネチャ内で入れ子にしません

CA1004: ジェネリック メソッドは型パラメーターを指定しなければなりません

CA1003: 汎用イベント ハンドラーのインスタンスを使用します

CA1007: 適切な場所にジェネリックを使用します

参照

関連項目

ジェネリック (C# プログラミング ガイド)