Partager via


CA1010 : Les collections doivent implémenter une interface générique

TypeName

CollectionsShouldImplementGenericInterface

CheckId

CA1010

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture

Cause

Un type visible de l'extérieur implémente l'interface System.Collections.IEnumerable, mais n'implémente pas l'interface System.Collections.Generic.IEnumerable<T>, et l'assembly conteneur cible .NET Framework 2.0.Cette règle ignore les types qui implémentent System.Collections.IDictionary.

Description de la règle

Pour étendre la facilité d'utilisation d'une collection, implémentez l'une des interfaces de collection génériques.La collection peut être ensuite utilisée pour remplir des types de collection génériques tels que :

Comment corriger les violations

Pour corriger une violation de cette règle, implémentez l'une des interfaces de collection génériques suivantes :

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle ; toutefois, l'utilisation de la collection sera plus limitée.

Exemple de violation

ms182132.collapse_all(fr-fr,VS.110).gifDescription

L'exemple suivant présente une classe (type référence) qui dérive de la classe non générique CollectionBase, qui viole cette règle.

ms182132.collapse_all(fr-fr,VS.110).gifCode

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(fr-fr,VS.110).gifCommentaires

Pour résoudre une violation de cette violation, vous devez implémenter les interfaces génériques ou modifier la classe de base en un type qui implémente déjà les interfaces génériques et les interfaces non génériques, telles que la classe Collection<T>.

Résoudre par modification de classe de base

ms182132.collapse_all(fr-fr,VS.110).gifDescription

L'exemple suivant résout la violation en modifiant la classe de base non générique CollectionBase de la collection en classe générique Collection<T> (Collection(Of T) dans Visual Basic).

ms182132.collapse_all(fr-fr,VS.110).gifCode

using System;
using System.Collections.ObjectModel; 

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

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

ms182132.collapse_all(fr-fr,VS.110).gifCommentaires

Modifier la classe de base d'une classe déjà finale est considéré par les consommateurs existants comme une modification avec rupture.

Résoudre par implémentation d'interface

ms182132.collapse_all(fr-fr,VS.110).gifDescription

L'exemple suivant résout la violation en implémentant ces interfaces génériques : IEnumerable<T>, ICollection<T> et IList<T> (IEnumerable(Of T), ICollection(Of T) et IList(Of T) dans Visual Basic).

ms182132.collapse_all(fr-fr,VS.110).gifCode

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

Règles connexes

CA1005 : Éviter les paramètres excessifs sur les types génériques

CA1000 : Ne pas déclarer de membres statiques sur les types génériques

CA1002 : Ne pas exposer de listes génériques

CA1006 : Ne pas imbriquer les types génériques dans les signatures de membre

CA1004 : Les méthodes génériques doivent fournir un paramètre de type

CA1003 : Utiliser les instances du gestionnaire d'événements génériques

CA1007 : Utiliser des classes génériques lorsque cela est approprié

Voir aussi

Référence

Génériques (guide de programmation C#)