CA1010: as coleções devem implementar a interface genérica
TypeName |
CollectionsShouldImplementGenericInterface |
CheckId |
CA1010 |
Categoria |
Microsoft.Design |
Alteração Significativa |
Sem quebra |
Causa
Um tipo externamente visível implementa a interface de IEnumerable mas não implementa a interface de IEnumerable , e o assembly que contém .NET Framework 2,0de destino.Esta regra ignora os tipos que implementam IDictionary.
Descrição da Regra
Para ampliar a utilidade de uma coleção, implementar uma das interfaces genéricas da coleção.A coleção pode ser usada para popular tipos genéricos da coleção como o seguinte:
Como Corrigir Violações
Para corrigir uma violação desta regra, implemente uma das seguintes interfaces genéricas da coleção:
Quando Suprimir Alertas
É seguro suprimir um aviso desta regra; no entanto, a coleção terá um uso mais limitado.
Violação de exemplo
Descrição
O exemplo a seguir mostra uma classe (tipo de referência) que deriva da classe não genérico de CollectionBase , que viola esta regra.
Código
using System;
using System.Collections;
namespace Samples
{
public class Book
{
public Book()
{
}
}
public class BookCollection : CollectionBase
{
public BookCollection()
{
}
public void Add(Book value)
{
InnerList.Add(value);
}
public void Remove(Book value)
{
InnerList.Remove(value);
}
public void Insert(int index, Book value)
{
InnerList.Insert(index, value);
}
public Book this[int index]
{
get { return (Book)InnerList[index]; }
set { InnerList[index] = value; }
}
public bool Contains(Book value)
{
return InnerList.Contains(value);
}
public int IndexOf(Book value)
{
return InnerList.IndexOf(value);
}
public void CopyTo(Book[] array, int arrayIndex)
{
InnerList.CopyTo(array, arrayIndex);
}
}
}
Comentários
Para corrigir uma violação dessa violação, você deve implementar as interfaces genéricas ou alterar a classe base em um tipo que implementa as interfaces mais genéricas e não genéricas, como a classe de Collection<T> .
Correção pela alteração da classe base
Descrição
O exemplo a seguir corrige a violação alterando a classe base da coleção da classe não genérico da classe CollectionBase genérico de Collection<T> (Collection(Of T) em Visual Basic).
Código
using System;
using System.Collections.ObjectModel;
namespace Samples
{
public class Book
{
public Book()
{
}
}
public class BookCollection : Collection<Book>
{
public BookCollection()
{
}
}
}
Comentários
Alterando a classe base de uma classe já liberada é considerado uma alteração aos consumidores existentes.
Correção pela implementação da interface
Descrição
O exemplo a seguir corrige a violação implementando estas interfaces genéricas: IEnumerable<T>, ICollection<T>, e IList<T> (IEnumerable(Of T), ICollection(Of T), e IList(Of T) em Visual Basic).
Código
using System;
using System.Collections;
using System.Collections.Generic;
namespace Samples
{
public class Book
{
public Book()
{
}
}
public class BookCollection : CollectionBase, IList<Book>
{
public BookCollection()
{
}
int IList<Book>.IndexOf(Book item)
{
return this.List.IndexOf(item);
}
void IList<Book>.Insert(int location, Book item)
{
}
Book IList<Book>.this[int index]
{
get { return (Book) this.List[index]; }
set { }
}
void ICollection<Book>.Add(Book item)
{
}
bool ICollection<Book>.Contains(Book item)
{
return true;
}
void ICollection<Book>.CopyTo(Book[] array, int arrayIndex)
{
}
bool ICollection<Book>.IsReadOnly
{
get { return false; }
}
bool ICollection<Book>.Remove(Book item)
{
if (InnerList.Contains(item))
{
InnerList.Remove(item);
return true;
}
return false;
}
IEnumerator<Book> IEnumerable<Book>.GetEnumerator()
{
return new BookCollectionEnumerator(InnerList.GetEnumerator());
}
private class BookCollectionEnumerator : IEnumerator<Book>
{
private IEnumerator _Enumerator;
public BookCollectionEnumerator(IEnumerator enumerator)
{
_Enumerator = enumerator;
}
public Book Current
{
get { return (Book)_Enumerator.Current; }
}
object IEnumerator.Current
{
get { return _Enumerator.Current; }
}
public bool MoveNext()
{
return _Enumerator.MoveNext();
}
public void Reset()
{
_Enumerator.Reset();
}
public void Dispose()
{
}
}
}
}
Regras Relacionadas
CA1005: evitar parâmetros excessivos em tipos genéricos
CA1000: não declarar membros estáticos em tipos genéricos
CA1002: não expor listas genéricas
CA1006: não aninhar tipos genéricos em assinaturas de membro
CA1004: os métodos genéricos devem fornecer o parâmetro de tipo
CA1003: usar instâncias do manipulador de eventos genéricos
CA1007: usar genéricos quando apropriado