Поделиться через


CA1010: коллекции должны реализовывать универсальный интерфейс

TypeName

CollectionsShouldImplementGenericInterface

CheckId

CA1010

Категория

Microsoft.Design

Критическое изменение

Не критическое

Причина

Доступный для внешнего кода тип реализует интерфейс System.Collections.IEnumerable, однако не реализует интерфейс System.Collections.Generic.IEnumerable<T> и содержащие его конечные объекты сборки платформы .NET Framework 2.0. Данное правило пропускает типы, которые реализуют интерфейс System.Collections.IDictionary.

Описание правила

Чтобы расширить возможности использования коллекции, реализуйте один из универсальных интерфейсов коллекции. Затем данную коллекцию можно использовать для заполнения универсальных типов коллекции, например следующих:

Устранение нарушений

Чтобы устранить нарушение данного правила, реализуйте один из следующих универсальных интерфейсов:

Отключение предупреждений

Отключение предупреждений о нарушении этого правила безопасно; однако возможности использования коллекции будут ограничены.

Пример нарушения

Описание

В следующем примере показан класс (ссылочный тип), который, в нарушение данного правила, наследует от неуниверсального класса 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> (Collection(Of T) в Visual Basic).

Код

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> (IEnumerable(Of T), ICollection(Of T) и IList(Of T) в Visual Basic).

Код

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#)