CA1039 : Les listes sont fortement typées
TypeName |
ListsAreStronglyTyped |
CheckId |
CA1039 |
Catégorie |
Microsoft.CSharp |
Modification avec rupture |
Oui |
Cause
Le type public ou protégé implémente IList mais ne fournit aucune méthode fortement typée pour l'un ou plusieurs des éléments suivants :
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
Description de la règle
Cette règle requiert que les implémentations IList fournissent des membres fortement typés afin que les utilisateurs ne soient pas tenus d'effectuer un cast d'arguments en type Object lorsqu'ils utilisent les fonctionnalités fournies par l'interface.L'interface IList est implémentée par des collections des objets accessibles par index.Cette règle suppose que le type qui implémente IList le fasse pour gérer une collection d'instances d'un type plus fort que Object.
IList implémente les interfaces ICollection et IEnumerable.Si vous implémentez IList, vous devez fournir les membres fortement typés requis pour ICollection.Si les objets de la collection étendent ValueType, vous devez fournir un membre fortement typé pour GetEnumerator pour éviter la baisse de performances provoquée par une opération boxing ; celle-ci n'est pas requise si les objets de la collection constituent un type référence.
Pour vous conformer à cette règle, implémentez explicitement les membres d'interface à l'aide de noms figurant dans le formulaire InterfaceName.InterfaceMemberName, tels que Add.Les membres d'interface explicites utilisent les types de données déclarés par l'interface.Implémentez les membres fortement typés à l'aide du nom de membre d'interface, tel que Add.Déclarez les membres fortement typés comme publics et déclarez des paramètres et des valeurs de retour de sorte qu'ils soient du type fort géré par la collection.Les types forts remplacent les types plus faibles, tels que Object et Array, déclarés par l'interface.
Comment corriger les violations
Pour résoudre une violation de cette règle, implémentez explicitement des membres IList et fournissez des substituts fortement typés pour les membres notés précédemment.Pour le code qui implémente correctement l'interface IList et fournit les membres fortement typés requis, consultez l'exemple suivant.
Quand supprimer les avertissements
Supprimez un avertissement de cette règle lorsque vous implémentez une nouvelle collection fondée sur des objets, telle qu'une liste liée, où des types qui étendent la nouvelle collection déterminent le type fort.Ces types doivent se conformer à cette règle et exposer des membres fortement typés.
Exemple
Dans l'exemple suivant, le type YourType étend CollectionBase, comme le doivent toutes les collections fortement typées.Notez que CollectionBase vous fournit l'implémentation explicite de l'interface IList.Par conséquent, vous devez fournir uniquement les membres fortement typés pour IList et 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);
}
}
}
Règles connexes
CA1035 : Les implémentations ICollection possèdent des membres fortement typés
CA1038 : Les énumérateurs doivent être fortement typés