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