CA1039: Listas são fortemente tipadas
TypeName |
ListsAreStronglyTyped |
CheckId |
CA1039 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Quebrando |
Causa
Público ou protegido digite implementa System.Collections.IList , mas não fornece um método com rigidez de tipos para uma ou mais das seguintes opções:
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
Descrição da regra
Esta regra requer IList implementações para fornecer altamente digitado membros para que os usuários não precisam converter argumentos para o System.Object tipo quando usarem a funcionalidade que é fornecida pela interface. O IList interface é implementada por coleções de objetos que podem ser acessados pelo índice. Esta regra pressupõe que o tipo que implementa IList faz isso para gerenciar uma coleção de instâncias de um tipo mais forte do que Object.
IListimplementa o System.Collections.ICollection e System.Collections.IEnumerable interfaces. Se você implementar IList, você deve fornecer membros fortemente tipados necessários para ICollection. Se os objetos na coleção estendem System.ValueType, você deve fornecer um membro com rigidez de tipos de GetEnumerator para evitar a diminuição no desempenho que é causado pela conversão boxing; não é necessário quando os objetos da coleção são um tipo de referência.
Para cumprir essa regra, implemente os membros de interface explicitamente usando nomes, como no formulário InterfaceName.InterfaceMemberName, Add. Os membros de interface explícita usar os tipos de dados que são declarados pela interface. Implementar membros fortemente tipados usando o nome do membro de interface, como Add. Declarar os membros com rigidez de tipos como public e declarar parâmetros e retornar valores a ser do tipo de alta segurança é gerenciado pela coleção. Os tipos de alta seguras substituir os tipos mais fracos como Object e Array que são declaradas pela interface.
Como corrigir violações
Para corrigir uma violação desta regra, implementar explicitamente IList membros e fornecer alternativas com rigidez de tipos para os membros anotado anteriormente. Para o código que implementa corretamente o IList interface e fornece os membros fortemente tipados, consulte o exemplo a seguir.
Quando suprimir avisos
Suprimi um aviso da regra quando você implementa uma nova coleção baseada em objeto, como, por exemplo, uma lista vinculada, onde a tipos de estendem a nova coleção determinam o tipo de alta segurança. Esses tipos devem cumprir essa regra e expor membros fortemente tipados.
Exemplo
No exemplo a seguir, o tipo de YourType estende System.Collections.CollectionBase, como todas as coleções com rigidez de tipos. Observe que CollectionBase fornece a implementação explícita de IList interface para você. Portanto, você deve fornecer somente os membros fortemente tipados para 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);
}
}
}
Regras relacionadas
CA1035: Implementações de ICollection com rigidez de tipos membros
CA1038: Enumeradores devem ser fortemente tipados
Consulte também
Referência
System.Collections.CollectionBase
System.Collections.ICollection