Compartir a través de


CA1039: Las listas están fuertemente tipadas

TypeName

ListsAreStronglyTyped

Identificador de comprobación

CA1039

Categoría

Microsoft.Design

Cambio problemático

Problemático

Motivo

El tipo público o protegido implementa IList pero no proporciona un método fuertemente tipado 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 que las implementaciones de IList proporcionen miembros fuertemente tipados para que los usuarios no necesiten convertir los argumentos en el tipo 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 ICollection y IEnumerable.Si implementa IList, debe proporcionar los miembros fuertemente tipados necesarios para ICollection.Si los objetos de la colección extienden ValueType, deberá proporcionar un miembro fuertemente tipado 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 fuertemente tipados utilizando el nombre del miembro de la interfaz, como Add.Declare los miembros fuertemente tipados como públicos, y declare los parámetros y valores devueltos para que sean del tipo seguro que administra 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 fuertemente tipadas para los miembros anteriormente mencionados.Para obtener el código que implementa correctamente la interfaz IList y proporciona los miembros fuertemente tipados necesarios, vea el ejemplo siguiente.

Cuándo suprimir advertencias

Suprima una advertencia de esta regla si implementa 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 fuertemente tipados.

Ejemplo

En el ejemplo siguiente, el tipo YourType extiende CollectionBase, como deberían todas las colecciones fuertemente tipadas.Observe que CollectionBase proporciona la implementación explícita de la interfaz IList para usted.Por consiguiente, solo debe proporcionar los miembros fuertemente tipados 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

CA1035: Las implementaciones de ICollection tienen miembros fuertemente tipados

CA1038: Los enumeradores deben estar fuertemente tipados

Vea también

Referencia

CollectionBase

ICollection

IEnumerable

IList

Object