CA1006 : Ne pas imbriquer les types génériques dans les signatures de membreCA1006: Do not nest generic types in member signatures

TypeNameTypeName DoNotNestGenericTypesInMemberSignaturesDoNotNestGenericTypesInMemberSignatures
CheckIdCheckId CA1006CA1006
CategoryCategory Microsoft.DesignMicrosoft.Design
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Un membre extérieurement visible a une signature qui contient un argument de type imbriqué.An externally visible member has a signature that contains a nested type argument.

Description de la règleRule Description

Un argument de type imbriqué est un argument de type qui est également un type générique.A nested type argument is a type argument that is also a generic type. Pour appeler un membre dont la signature contient un argument de type imbriqué, l’utilisateur doit instancier un type générique et passer ce type au constructeur d’un deuxième type générique.To call a member whose signature contains a nested type argument, the user must instantiate one generic type and pass this type to the constructor of a second generic type. La procédure et la syntaxe requises sont complexes et doivent être évitées.The required procedure and syntax are complex and should be avoided.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, modifiez le design pour supprimer l’argument de type imbriqué.To fix a violation of this rule, change the design to remove the nested type argument.

Quand supprimer les avertissementsWhen to Suppress Warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule. Fourniture de génériques dans une syntaxe facile à comprendre et à utiliser réduit le temps nécessaire pour en savoir plus et augmente le taux d’adoption de nouvelles bibliothèques.Providing generics in a syntax that is easy to understand and use reduces the time that is required to learn and increases the adoption rate of new libraries.

ExempleExample

L’exemple suivant montre une méthode qui enfreint la règle et la syntaxe qui est requis pour appeler la méthode en violation.The following example shows a method that violates the rule and the syntax that is required to call the violating method.

Imports System
Imports System.Collections.Generic

Namespace DesignLibrary

   Public Class IntegerCollections
   
      Sub NonNestedCollection(collection As ICollection(Of Integer))
      
         For Each I As Integer In DirectCast( _ 
            collection, IEnumerable(Of Integer))

            Console.WriteLine(I)

         Next 

      End Sub

      ' This method violates the rule.
      Sub NestedCollection( _ 
         outerCollection As ICollection(Of ICollection(Of Integer)))
      
         For Each innerCollection As ICollection(Of Integer) In _ 
            DirectCast(outerCollection, _ 
                       IEnumerable(Of ICollection(Of Integer)))

            For Each I As Integer In _ 
               DirectCast(innerCollection, IEnumerable(Of Integer))

               Console.WriteLine(I)

            Next

         Next
 
      End Sub

   End Class

   Class Test
   
      Shared Sub Main()
      
         Dim collections As New IntegerCollections()

         Dim integerListA As New List(Of Integer)()
         integerListA.Add(1)
         integerListA.Add(2)
         integerListA.Add(3)

         collections.NonNestedCollection(integerListA)

         Dim integerListB As New List(Of Integer)()
         integerListB.Add(4)
         integerListB.Add(5)
         integerListB.Add(6)

         Dim integerListC As New List(Of Integer)()
         integerListC.Add(7)
         integerListC.Add(8)
         integerListC.Add(9)

         Dim nestedIntegerLists As New List(Of ICollection(Of Integer))()
         nestedIntegerLists.Add(integerListA)
         nestedIntegerLists.Add(integerListB)
         nestedIntegerLists.Add(integerListC)

         collections.NestedCollection(nestedIntegerLists)

      End Sub

   End Class

End Namespace
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 : Évitez trop de paramètres sur les types génériquesCA1005: Avoid excessive parameters on generic types

CA1010 : Les collections doivent implémenter une interface génériqueCA1010: Collections should implement generic interface

CA1000 : Ne déclarez pas de membres statiques sur les types génériquesCA1000: Do not declare static members on generic types

CA1002 : N’exposez pas de listes génériquesCA1002: Do not expose generic lists

CA1004 : Les méthodes génériques doivent fournir un paramètre de typeCA1004: Generic methods should provide type parameter

CA1003 : Utiliser les instances du gestionnaire d’événements génériquesCA1003: Use generic event handler instances

CA1007 : Utiliser des méthodes génériques lorsque cela est appropriéCA1007: Use generics where appropriate

Voir aussiSee Also

GénériquesGenerics