CA1039: Las listas están fuertemente tipadas
Nombre de tipo |
ListsAreStronglyTyped |
Identificador de comprobación |
CA1039 |
Categoría |
Microsoft.Design |
Cambio problemático |
Sí |
Motivo
El tipo público o protegido implementa System.Collections.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 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 fuertemente tipados necesarios para ICollection.Si los objetos de la colección extienden System.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 System.Collections.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
System.Collections.CollectionBase
System.Collections.ICollection