CA1039: Gli elenchi sono fortemente tipizzati
TypeName |
ListsAreStronglyTyped |
CheckId |
CA1039 |
Category |
Microsoft.Design |
Breaking Change |
Breaking |
Causa
Il tipo pubblico o protetto implementa 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 Object quando utilizzano la funzionalità fornita dall'interfaccia.L'interfaccia IList è implementata da raccolte di oggetti a cui è possibile accedere tramite l'indice.La regola presuppone che il tipo che implementa IList esegua questa operazione per gestire una raccolta di istanze di un tipo più sicuro di Object.
IList implementa le interfacce ICollection e IEnumerable.Se si implementa IList, è necessario fornire i membri fortemente tipizzati necessari per ICollection.Se gli oggetti della raccolta estendono 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 della raccolta 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 dalla raccolta.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 una nuova raccolta basata su oggetti, ad esempio un elenco collegato in cui i tipi che estendono la nuova raccolta 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 CollectionBase, come richiesto a tutte le raccolte fortemente tipizzate.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