Condividi tramite


CA1039: Gli elenchi sono fortemente tipizzati

TypeName

ListsAreStronglyTyped

CheckId

CA1039

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Il tipo pubblico o protetto implementa System.Collections.IList, ma non fornisce un metodo fortemente tipizzato per uno o più degli elementi riportati di seguito:

  • IList.Item

  • IList.Add

  • IList.Contains

  • IList.IndexOf

  • IList.Insert

  • IList.Remove

Descrizione della regola

La regola richiede che le implementazioni di IList forniscano membri fortemente tipizzati in modo che agli utenti non venga richiesto di eseguire il cast di argomenti al tipo System.Object quando utilizzano la funzionalità fornita dall'interfaccia. L'interfaccia IList è implementata da insiemi di oggetti a cui è possibile accedere tramite l'indice. La regola presuppone che il tipo che implementa IList esegua questa operazione per gestire un insieme di istanze di un tipo più sicuro di Object.

IList implementa le interfacce System.Collections.ICollection e System.Collections.IEnumerable. Se si implementa IList, è necessario fornire i membri fortemente tipizzati necessari per ICollection. Se gli oggetti dell'insieme estendono System.ValueType, è necessario fornire un membro fortemente tipizzato per il metodo GetEnumerator allo scopo di evitare un calo delle prestazioni causato dal boxing. Questa operazione non è necessaria quando gli oggetti dell'insieme sono un tipo di riferimento.

Per conformità a questa regola, implementare in modo esplicito i membri dell'interfaccia utilizzando nomi nel formato NomeInterfaccia.NomeMembroInterfaccia, ad esempio Add. I membri di interfaccia espliciti utilizzano i tipi di dati dichiarati dall'interfaccia. Implementare i membri fortemente tipizzati mediante il nome del membro dell'interfaccia, ad esempio Add. Dichiarare i membri fortemente tipizzati come pubblici e dichiarare i parametri e i valori restituiti in modo che siano del tipo sicuro gestito dall'insieme. I tipi sicuri sostituiscono i tipi meno sicuri quali Object e Array dichiarati dall'interfaccia.

Come correggere le violazioni

Per correggere una violazione di questa regola, implementare in modo esplicito i membri IList e fornire alternative fortemente tipizzate per i membri indicati in precedenza. Affinché il codice implementi correttamente l'interfaccia IList e fornisca i membri fortemente tipizzati necessari, vedere l'esempio riportato di seguito.

Esclusione di avvisi

Escludere un avviso da questa regola quando si implementa un nuovo insieme basato su oggetti, ad esempio un elenco collegato in cui i tipi che estendono il nuovo insieme determinano il tipo sicuro. Questi tipi devono essere conformi a questa regola ed esporre membri fortemente tipizzati.

Esempio

Nell'esempio riportato di seguito, il tipo YourType estende System.Collections.CollectionBase, come richiesto a tutti gli insiemi fortemente tipizzati. Si noti che CollectionBase consente di fornire l'implementazione esplicita dell'interfaccia IList. Pertanto, è necessario fornire solo i membri fortemente tipizzati per IList e 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);
      }
   }
}

Regole correlate

CA1035: Le implementazioni di ICollection hanno membri fortemente tipizzati

CA1038: Gli enumeratori devono essere fortemente tipizzati

Vedere anche

Riferimenti

System.Collections.CollectionBase

System.Collections.ICollection

System.Collections.IEnumerable

System.Collections.IList

System.Object