Sdílet prostřednictvím


CA1006: Nelze vnořit obecné typy v podpisech členské

Název_typu

DoNotNestGenericTypesInMemberSignatures

CheckId

CA1006

Kategorie

Microsoft.design

Změnit rozdělení

Rozdělení

Příčina

Externě viditelné člen má podpis, který obsahuje vnořený typ argumentu.

Popis pravidla

Vnořený typ argumentu je argument typ, který je také obecného typu.Chcete-li volat člen, jehož podpis obsahuje vnořený typ argumentu musí uživatel konkretizovat jeden obecný typ a předat konstruktoru druhý obecný typ tohoto typu.Požadovanou proceduru a syntaxe jsou složité a je třeba se vyhnout.

Jak opravit porušení

Porušení tohoto pravidla opravit, změňte návrh Odstranit vnořený typ argumentu.

Při potlačení upozornění

Nepotlačovat upozornění od tohoto pravidla.Poskytování generics v syntaxi, která je snadné pochopení a použití snižuje dobu požadované informace a zvyšuje rychlost přijímání nových knihoven.

Příklad

Následující příklad ukazuje metodu, která porušují pravidlo a syntaxi, která je nutné volat metodu porušení.

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

Souvisejících pravidel

CA1005: Vyhnout se nadměrnému parametry na obecné typy

CA1010: Kolekce by mělo provádět obecné rozhraní

CA1000: Nelze deklarovat statické členy na obecné typy

CA1002: Obecný seznamech neuvádějí.

CA1004: Obecné metody by měl poskytnout parametr typu

CA1003: Použít událost obecný popisovač instance

CA1007: Pomocí generics, případně

Viz také

Referenční dokumentace

Generics (Příručka programování C#)