CA1039: Las listas están fuertemente tipadas

Elemento Valor
RuleId CA1039
Category Microsoft.Design
Cambio importante Problemático

Causa

El tipo público o protegido implementa System.Collections.IList, pero no proporciona un método fuertemente tipado para uno o varios de los siguientes:

  • IList.Item

  • IList.Add

  • IList.Contains

  • IList.IndexOf

  • IList.Insert

  • IList.Remove

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

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 System.Object cuando utilicen la funcionalidad proporcionada por la interfaz. La interfaz IList se implementa mediante colecciones de objetos a los que puede acceder el índice. Esta regla supone que el tipo que implementa IList administre 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 fuertemente tipados necesarios para ICollection. Si los objetos de la colección extienden System.ValueType, debe proporcionar un miembro fuertemente tipado para GetEnumerator, a fin de evitar la disminución del rendimiento causado por la conversión boxing; esto no es necesario cuando los objetos de la colección son un tipo de referencia.

Para cumplir esta regla, implemente explícitamente los miembros de la interfaz mediante el uso de nombres con el formato InterfaceName.InterfaceMemberName, como Add. Los miembros de interfaz explícitos usan los tipos de datos declarados por la interfaz. Implemente los miembros fuertemente tipados mediante el nombre del miembro de interfaz, como Add. Declare los miembros fuertemente tipados como públicos y declare parámetros y valores devueltos para que sean del tipo seguro administrado por la colección. Los tipos seguros reemplazan 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, implemente los miembros IList explícitamente y proporcione alternativas fuertemente tipadas para los miembros anotados anteriormente. Para obtener código que implemente correctamente la interfaz IList y proporcione los miembros fuertemente tipados necesarios, consulte el ejemplo siguiente.

Cuándo suprimir las advertencias

Suprima una advertencia de esta regla cuando implemente una nueva colección basada en objetos, como una lista vinculada, donde los tipos que extienden la nueva colección determinan el tipo seguro. Estos tipos deben cumplir esta regla y exponer miembros fuertemente tipados.

Ejemplo

En el ejemplo siguiente, el tipo YourType extiende System.Collections.CollectionBase, como deberían hacerlo todas las colecciones fuertemente tipadas. CollectionBase proporciona la implementación explícita de la interfaz IList. Por lo tanto, 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);
      }
   }
}

CA1035: Las implementaciones de ICollection tienen miembros fuertemente tipados

CA1038: Los enumeradores deben estar fuertemente tipados

Consulte también