Partilhar via


CA1006: Não aninhar tipos genéricos em assinaturas de membro

Item Valor
RuleId CA1006
Categoria Microsoft.Design
Alteração da falha Quebra

Causa

Um membro visível externamente tem uma assinatura que contém um argumento de tipo aninhado.

Descrição da regra

Um argumento de tipo aninhado é um argumento de tipo que também é um tipo genérico. Para chamar um membro cuja assinatura contenha um argumento de tipo aninhado, o usuário deve criar uma instância de um tipo genérico e passar esse tipo para o construtor de um segundo tipo genérico. O procedimento e a sintaxe obrigatórios são complexos e devem ser evitados.

Como corrigir violações

Para corrigir uma violação dessa regra, altere o design para remover o argumento de tipo aninhado.

Quando suprimir avisos

Não suprima um aviso nessa regra. Fornecer genéricos em uma sintaxe fácil de entender e usar reduz o tempo necessário para aprender e aumenta a taxa de adoção de novas bibliotecas.

Exemplo

O exemplo a seguir mostra um método que viola a regra e a sintaxe necessária para chamar o método responsável pela violação.

using System;
using System.Collections.Generic;

namespace DesignLibrary
{
   public class IntegerCollections
   {
      public void NotNestedCollection(ICollection<int> collection)
      {
         foreach(int i in collection)
         {
            Console.WriteLine(i);
         }
      }

      // This method violates the rule.
      public void NestedCollection(
         ICollection<ICollection<int>> outerCollection)
      {
         foreach(ICollection<int> innerCollection in outerCollection)
         {
            foreach(int i in innerCollection)
            {
               Console.WriteLine(i);
            }
         }
      }
   }

   class Test
   {
      static void Main()
      {
         IntegerCollections collections = new IntegerCollections();

         List<int> integerListA = new List<int>();
         integerListA.Add(1);
         integerListA.Add(2);
         integerListA.Add(3);

         collections.NotNestedCollection(integerListA);

         List<int> integerListB = new List<int>();
         integerListB.Add(4);
         integerListB.Add(5);
         integerListB.Add(6);

         List<int> integerListC = new List<int>();
         integerListC.Add(7);
         integerListC.Add(8);
         integerListC.Add(9);

         List<ICollection<int>> nestedIntegerLists = 
            new List<ICollection<int>>();
         nestedIntegerLists.Add(integerListA);
         nestedIntegerLists.Add(integerListB);
         nestedIntegerLists.Add(integerListC);

         collections.NestedCollection(nestedIntegerLists);
      }
   }
}

CA1005: Evitar parâmetros excessivos em tipos genéricos

CA1010: Coleções devem implementar uma interface genérica

CA1000: Não declarar membros estáticos em tipos genéricos

CA1002: Não expor listas genéricas

CA1004: Métodos genéricos devem fornecer um parâmetro de tipo

CA1003: Usar instâncias do manipulador de eventos genérico

CA1007: Usar genéricos quando apropriado

Confira também

Genéricos