Compartir a través de


CA1010: Las colecciones deben implementar la interfaz genérica

TypeName

CollectionsShouldImplementGenericInterface

Identificador de comprobación

CA1010

Categoría

Microsoft.Design

Cambio problemático

Poco problemático

Motivo

Un tipo visible externamente implementa la interfaz IEnumerable pero no la interfaz IEnumerable, y el ensamblado que lo contiene está diseñado para .NET Framework 2,0.Esta regla omite los tipos que implementan IDictionary.

Descripción de la regla

Para ampliar la utilidad de una colección, implemente una de las interfaces de colección genéricas.A continuación, la colección se puede utilizar para rellenar tipos de colecciones genéricas, como los siguientes:

Cómo corregir infracciones

Para corregir una infracción de esta regla, implemente una de las interfaces de colección genéricas siguientes:

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla; sin embargo, la colección tendrá un uso más limitado.

Infracción de ejemplo

Descripción

El ejemplo siguiente muestra una clase (tipo de referencia) que deriva de la clase no genérica CollectionBase, que infringe esta regla.

Código

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

Comentarios

Para corregir una infracción de esta infracción, debe implementar las interfaces genéricas o cambiar la clase base a un tipo que implemente tanto las interfaces genéricas como las no genéricas, como por ejemplo la clase Collection<T>.

Corregir por cambio de clase base

Descripción

En el ejemplo siguiente se corrige la infracción cambiando la clase base de la colección de la clase no genérica CollectionBase a la clase genérica Collection<T> (Collection(Of T) en Visual Basic).

Código

using System;
using System.Collections.ObjectModel; 

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

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

Comentarios

Si se cambia la clase base de una clase que ya se ha liberado, se considera un cambio importante para los consumidores.

Corregir por implementación de interfaz

Descripción

En el siguiente ejemplo se corrige la infracción implementado estas interfaces genéricas IEnumerable<T>, ICollection<T> y IList<T> (IEnumerable(Of T), ICollection(Of T) y IList(Of T) en Visual Basic).

Código

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

Reglas relacionadas

CA1005: Evite parámetros excesivos en tipos genéricos

CA1000: No declarar miembros estáticos en tipos genéricos

CA1002: No exponer listas genéricas

CA1006: No anidar tipos genéricos en firmas de miembro

CA1004: Los métodos genéricos deben proporcionar un parámetro de tipo

CA1003: Utilizar instancias genéricas de controlador de eventos

CA1007: Utilizar valores genéricos cuando sea posible

Vea también

Referencia

Genéricos (Guía de programación de C#)