Export (0) Print
Expand All
Expand Minimize

Do not nest generic types in member signatures

TypeName

DoNotNestGenericTypesInMemberSignatures

CheckId

CA1006

Category

Microsoft.Design

Breaking Change

Breaking

An externally visible member has a signature that contains a nested type argument.

A nested type argument is a type argument that is also a generic type. 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. The required procedure and syntax is complex and should be avoided.

To fix a violation of this rule, change the design to remove the nested type argument.

Do not exclude a warning from this rule. Providing generics in a syntax that is easy to understand and use reduces the time it that is required to learn and increases the adoption rate of new libraries.

The following example shows a method that violates the rule and the syntax 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

Community Additions

ADD
Show:
© 2014 Microsoft