다음을 통해 공유


CA1010: 컬렉션은 제네릭 인터페이스를 구현해야 합니다.

TypeName

CollectionsShouldImplementGenericInterface

CheckId

CA1010

범주

Microsoft.Design

변경 수준

주요 변경 아님

원인

외부에 노출되는 형식이 System.Collections.IEnumerable 인터페이스는 구현하지만 System.Collections.Generic.IEnumerable<T> 인터페이스는 구현하지 않으며, 포함하는 어셈블리가 .NET Framework 2.0을 대상으로 합니다.이 규칙은 System.Collections.IDictionary를 구현하는 형식을 무시합니다.

규칙 설명

컬렉션의 유용성을 높이려면 제네릭 컬렉션 인터페이스 중 하나를 구현합니다.그러면 컬렉션을 사용하여 다음과 같은 제네릭 컬렉션 형식을 채울 수 있습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 다음 제네릭 컬렉션 인터페이스 중 하나를 구현합니다.

경고를 표시하지 않는 경우

이 규칙에서 경고를 표시하지 않도록 설정해도 안전하지만 이렇게 하면 컬렉션의 용도가 더 제한됩니다.

규칙 위반 예

ms182132.collapse_all(ko-kr,VS.110).gif설명

다음 예제에서는 제네릭이 아닌 CollectionBase 클래스에서 파생되며 이 규칙을 위반하는 클래스(참조 형식)를 보여 줍니다.

ms182132.collapse_all(ko-kr,VS.110).gif코드

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);
        }
    }
}

ms182132.collapse_all(ko-kr,VS.110).gif설명

이 규칙 위반 문제를 해결하려면 제네릭 인터페이스를 구현하거나 Collection<T> 클래스와 같이 제네릭 인터페이스와 제네릭이 아닌 인터페이스를 이미 모두 구현하는 형식으로 기본 형식을 변경해야 합니다.

기본 형식 변경을 통한 해결 방법

ms182132.collapse_all(ko-kr,VS.110).gif설명

다음 예제에서는 컬렉션의 기본 형식을 제네릭이 아닌 CollectionBase 클래스에서 제네릭 Collection<T>(Visual Basic의 경우 Collection(Of T)) 클래스로 변경하여 위반 문제를 해결합니다.

ms182132.collapse_all(ko-kr,VS.110).gif코드

using System;
using System.Collections.ObjectModel; 

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

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

ms182132.collapse_all(ko-kr,VS.110).gif설명

이미 발표된 클래스의 기본 클래스를 변경하는 것은 기존 소비자에게 주요 변경 사항으로 간주됩니다.

인터페이스 구현을 통한 해결 방법

ms182132.collapse_all(ko-kr,VS.110).gif설명

다음 예제에서는 제네릭 클래스 IEnumerable<T>, ICollection<T> 및 IList<T>(Visual Basic의 경우 IEnumerable(Of T), ICollection(Of T) 및 IList(Of T))를 구현하여 규칙 위반 문제를 해결합니다.

ms182132.collapse_all(ko-kr,VS.110).gif코드

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# 프로그래밍 가이드)