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.
Avez-vous vraiment besoin d'appeler 'params.AsEnumerable()', comme déjà de type 'T()'? –