Les listes sont fortement typées
Mise à jour : novembre 2007
TypeName |
ListsAreStronglyTyped |
CheckId |
CA1039 |
Catégorie |
Microsoft.CSharp |
Modification avec rupture |
Oui |
Cause
Le type public ou protégé implémente System.Collections.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 System.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 System.Collections.ICollection et System.Collections.IEnumerable. Si vous implémentez IList, vous devez fournir les membres fortement typés requis pour ICollection. Si les objets de la collection étendent System.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 lors de l'implémentation d'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 System.Collections.CollectionBase, comme le doivent toutes les collections fortement typées. Notez que CollectionBase fournit l'implémentation explicite de l'interface IList pour vous ; donc vous devez uniquement fournir les membres fortement typés de 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
Les implémentations ICollection possèdent des membres fortement typés
Les énumérateurs doivent être fortement typés
Voir aussi
Référence
System.Collections.CollectionBase
System.Collections.ICollection