2009-10-17 4 views
0

Inspiré par la variable Javascripts Arguments dans Max()/Min() et la compréhension de liste dans les langages fonctionnels J'ai essayé d'obtenir la même chose dans VB.NET donné IEnumerable (de T) comme resulttype. Cela fonctionne bien sauf pour les cordes. Pourquoi? Ce type de méthodes d'extension peut être considéré comme une mauvaise idée. Toute bonne raison Pourquoi c'est une mauvaise idée.Générique Méthode d'extension Concat pour Paramarrays ne fonctionne pas pour IEnumerable (de String)

Option Explicit On 
    Option Strict On 

    Imports System.Runtime.CompilerServices 

    Module Module1 

     Sub Main() 
      Dim xs As IEnumerable(Of Integer) = 1.Concat(2, 3, 4) 
      Dim ys As IEnumerable(Of Double) = 1.0.Concat(2.0, 3.0, 4.0) 
      Dim zs As IEnumerable(Of String) = Concat("1", "2", "3", "4") 'silly but works, I would use a stringbuilder 
      'Dim zs2 As IEnumerable(Of String) = "1".Concat("2", "3", "4") ' does not work why? 
      'Gives: 
      'String' cannot be converted to 'System.Collections.Generic.IEnumerable(Of String)' 
      'because() 'Char' is not derived from 'String', as required for the 'Out' generic parameter 'T' in 'Interface IEnumerable(Of Out T)'. 
      'C:\Users\kruse\Documents\Visual Studio 10\Projects\VarArgsExperiment\VarArgsExperiment\Module1.vb 12 45 VarArgsExperiment 

      Console.ReadLine() 
     End Sub 



     <Extension()> _ 
     Function Concat(Of T)(ByVal xs As IEnumerable(Of T), ByVal ParamArray params As T()) As IEnumerable(Of T) 
      Dim ys As IEnumerable(Of T) = params.AsEnumerable() 
      Return xs.Concat(ys) 
     End Function 

     <Extension()> _ 
     Function Concat(Of T)(ByVal x As T, ByVal ParamArray params As T()) As IEnumerable(Of T) 
      Dim xs As New List(Of T) 
      xs.Add(x) 
      Dim ys As IEnumerable(Of T) = params.AsEnumerable 
      Return xs.Concat(ys) 
     End Function 
End Module 

... Couper le reste du module pour être bref. Als a écrit quelques méthodes pour Add, Cast et un Apply for Action.

+0

Avez-vous vraiment besoin d'appeler 'params.AsEnumerable()', comme déjà de type 'T()'? –

Répondre

1

Une chaîne est un IEnumerable<char> et il n'y a pas de relation entre une chaîne et un caractère. Vous pouvez le considérer comme un problème de dimensions, une chaîne peut généralement être considérée comme un tableau de char. char [] n'équivaut pas à char, et ne le sera jamais. System.String implémente également une méthode Concat qui peut jouer avec votre signature de type, donc vous pourriez vouloir faire attention à cela.

+1

Vous avez raison. c'est le Concat de String qui donne des ennuis. trouvé dans un autre poste sur les méthodes d'extension. –

Questions connexes