Las listas tienen establecimiento inflexible de tipos

Actualización: noviembre 2007

Nombre de tipo

ListsAreStronglyTyped

Identificador de comprobación

CA1039

Categoría

Microsoft.Design

Cambio problemático

Motivo

El tipo público o protegido implementa System.Collections.IList pero no proporciona un método con establecimiento inflexible de tipos para uno o más de los siguientes:

  • IList.Item

  • IList.Add

  • IList.Contains

  • IList.IndexOf

  • IList.Insert

  • IList.Remove

Descripción de la regla

Esta regla requiere implementaciones de IList para proporcionar miembros con establecimiento inflexible de tipos para que los usuarios no necesiten convertir los argumentos en el tipo System.Object cuando utilicen la funcionalidad proporcionada por la interfaz. Las colecciones de objetos a los que se puede tener acceso por medio del índice implementan la interfaz IList. Esta regla supone que el tipo que implementa IList contiene una colección de instancias de un tipo que es más fuerte que Object.

IList implementa las interfaces System.Collections.ICollection y System.Collections.IEnumerable. Si implementa IList, debe proporcionar los miembros con establecimiento inflexible de tipos necesarios para ICollection. Si los objetos de la colección extienden System.ValueType, deberá proporcionar un miembro con establecimiento inflexible de tipos para GetEnumerator para evitar disminuir el rendimiento provocado por la conversión boxing; esto no es necesario si los objetos de la colección son un tipo de referencia.

Para cumplir esta regla, implemente los miembros de la interfaz utilizando explícitamente los nombres en el formulario InterfaceName.InterfaceMemberName, como Add. Los miembros de la interfaz explícitos utilizan los tipos de datos declarados por la interfaz. Implemente los miembros con establecimiento inflexible de tipos utilizando el nombre del miembro de la interfaz, como Add. Declare los miembros con establecimiento inflexible de tipos como públicos y declare los parámetros y valores devueltos para tener establecimiento inflexible de tipos administrados por la colección. Los tipos con establecimiento inflexible reemplazan a los tipos más débiles como Object y Array declarados por la interfaz.

Cómo corregir infracciones

Para corregir una infracción de esta regla, explícitamente implemente los miembros IList y proporcione las alternativas con establecimiento inflexible de tipos para los miembros anteriormente mencionados. Para obtener el código que implementa correctamente la interfaz IList y proporciona los miembros con establecimiento inflexible de tipos necesarios, vea el ejemplo siguiente.

Cuándo suprimir advertencias

Suprima una advertencia de esta regla al implementar una colección nueva basada en objetos, como una lista vinculada, donde los tipos que extienden la nueva colección determinan el establecimiento inflexible de tipos. Estos tipos deberían cumplir esta regla y exponer los miembros con establecimiento inflexible de tipos.

Ejemplo

En el ejemplo siguiente, el tipo YourType extiende System.Collections.CollectionBase, como deberían todas las colecciones con establecimiento inflexible de tipos. Tenga en cuenta que CollectionBase proporciona la implementación explícita de la interfaz IList, de modo que sólo necesita proporcionar los miembros con establecimiento inflexible de tipos para IList y ICollection.

using System;
using System.Collections;
namespace DesignLibrary
{
   public class YourType
   {
      // Implementation for your strong type goes here.

      public YourType() {}
   }

   public class YourTypeCollection : CollectionBase
   {
      // Provide the strongly typed members for IList.
      public YourType this[int index]
      {
         get 
         {
            return (YourType) ((IList)this)[index];
         }
         set 
         {
            ((IList)this)[index] =  value;
         }
      }

      public int Add(YourType value)
      {
         return ((IList)this).Add ((object) value);
      }

      public bool Contains(YourType value) 
      {
         return ((IList)this).Contains((object) value);
      }

      public void Insert(int index, YourType value) 
      {
         ((IList)this).Insert(index, (object) value);
      }

      public void Remove(YourType value) 
      {
         ((IList)this).Remove((object) value);
      }

      public int IndexOf(YourType value) 
      {
         return ((IList)this).IndexOf((object) value);
      }

      // Provide the strongly typed member for ICollection.

      public void CopyTo(YourType[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }
   }
}

Reglas relacionadas

Las implementaciones de ICollection tienen miembros con establecimiento inflexible de tipos

Los enumeradores deben tener establecimiento inflexible de tipos

Vea también

Referencia

System.Collections.CollectionBase

System.Collections.ICollection

System.Collections.IEnumerable

System.Collections.IList

System.Object