Udostępnij za pośrednictwem


CA1006: Nie zagnieżdżaj typów generycznych w podpisach elementu członkowskiego

TypeName

DoNotNestGenericTypesInMemberSignatures

CheckId

CA1006

Kategoria

Microsoft.Design

Złamanie zmiany

Złamanie

Przyczyna

Widoczne z zewnątrz członek ma podpis, który zawiera argument typu zagnieżdżonego.

Opis reguły

Argument typu zagnieżdżonego jest argument typu, który jest również typu rodzajowego.Aby wywołać członek, którego podpis zawiera argument typu zagnieżdżonego, użytkownik musi wystąpienia jednego typu rodzajowego i przekazywania tego typu do konstruktora drugi typ rodzajowy.Wymagane procedury i składni są złożone i należy unikać.

Jak naprawić naruszenia

Aby usunąć naruszenie tej zasady, należy zmienić projekt, aby usunąć argument typu zagnieżdżonego.

Kiedy do pomijania ostrzeżenia

Nie pomijaj ostrzeżenie od tej reguły.Dostarczanie produktów pierwotnych w składni, która jest łatwe do zrozumienia i użyć zmniejsza czas, który jest wymagany, aby dowiedzieć się i zwiększa szybkość przyjęcia nowych bibliotek.

Przykład

W poniższym przykładzie metody, które powodują naruszenie reguł i składni, który jest niezbędny do wywoływania metody naruszyli.

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);
      }
   }
}

Zasady pokrewne

CA1005: Unikaj nadużywania parametrów na typach generycznych

CA1010: Kolekcje powinny implementować interfejs generyczny

CA1000: Nie deklaruj statycznych elementów członkowskich na typach generycznych

CA1002: Nie ujawniaj list generycznych

CA1004: Generyczne metody powinny dostarczyć parametry typu

CA1003: Użyj wystąpień obsługi zdarzeń generycznych

CA1007: Używaj danych generycznych wszędzie, gdzie jest to odpowiednie

Zobacz też

Informacje

Typy ogólne (Przewodnik programowania w języku C#)