Partager via


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 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 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 System.Collections.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

Voir aussi

Référence

System.Collections.CollectionBase

System.Collections.ICollection

System.Collections.IEnumerable

System.Collections.IList

System.Object