Udostępnij za pośrednictwem


CA1010: Kolekcji należy implementować interfejs rodzajowy

TypeName

CollectionsShouldImplementGenericInterface

CheckId

CA1010

Kategoria

Microsoft.Design

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ widoczny na zewnątrz implementuje interfejs System.Collections.IEnumerable, ale nie implementuje interfejsu System.Collections.Generic.IEnumerable<T> i zawierającego cele zestawu .NET Framework 2.0.Ta reguła ignoruje typy implementujące System.Collections.IDictionary.

Opis reguły

Aby poszerzyć użyteczność kolekcji, zaimplementuj jeden z interfejsów kolekcji generycznej.Następnie można użyć kolekcji do wypełnienia kolekcji generycznych takich jak:

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy zaimplementować jeden z następujących interfejsów kolekcji generycznej:

Kiedy pominąć ostrzeżenia

Bezpiecznie jest wyłączyć ostrzeżenia dotyczące tej zasady, jednak kolekcja będzie miała bardziej ograniczone zastosowanie.

Przykład naruszenia

ms182132.collapse_all(pl-pl,VS.110).gifOpis

Poniższy przykład pokazuje klasę (typ odwołania), która pochodzi z klasy niegenerycznej CollectionBase, która narusza reguły.

ms182132.collapse_all(pl-pl,VS.110).gifKod

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(pl-pl,VS.110).gifKomentarze

Aby naprawić naruszenie tego naruszenia, należy implementować interfejsy generyczne lub zmienić klasę podstawową na typ, który już implementuje zarówno generyczne, jak i niegeneryczne interfejsy, takie jak klasy Collection<T>.

Naprawa przez zmianę klasy podstawowej

ms182132.collapse_all(pl-pl,VS.110).gifOpis

Poniższy przykład naprawia naruszenie przez zmianę klasy podstawowej kolekcji z niegenerycznej klasy CollectionBase, na klasę generyczną Collection<T> (Collection(Of T) w Visual Basic).

ms182132.collapse_all(pl-pl,VS.110).gifKod

using System;
using System.Collections.ObjectModel; 

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

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

ms182132.collapse_all(pl-pl,VS.110).gifKomentarze

Zmiana klasy podstawowej już wydanej klasy jest uważana za kluczową zmianę dla istniejących konsumentów.

Naprawa przez implementację interfejsu

ms182132.collapse_all(pl-pl,VS.110).gifOpis

Poniższy przykład naprawia naruszenie przez implementowanie następujących interfejsów generycznych: IEnumerable<T>, ICollection<T> i IList<T> (IEnumerable(Of T), ICollection(Of T) i IList(Of T) w Visual Basic).

ms182132.collapse_all(pl-pl,VS.110).gifKod

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()
            {
            }
        }
    }
}

Powiązane reguły

CA1005: Uniknąć nadmiernego parametrów na typy rodzajowe

CA1000: Elementy statyczne nie są deklarowane w typach podstawowych

CA1002: Nie będą uwidaczniać rodzajowy list

CA1006: Nie zagnieżdżaj typy rodzajowe w Członkowskim podpisów

CA1004: Metody rodzajowe powinny dostarczyć parametr typu

CA1003: Użyj wystąpień programu obsługi zdarzeń rodzajowy

CA1007: Użyj generyczne, gdzie stosowne

Zobacz też

Informacje

Generyczne (Podręcznik programowania C#)