2009-10-17 54 views
0

馬克斯(靈感來自Javascript角可變參數)/ MIN()和函數式語言列表解析參數數組通用的毗連擴展方法我嘗試使用通用擴展方法來獲得同樣的在VB.NET給定IEnumerable(T)作爲resulttype。除了字符串,這很好。爲什麼? 這些擴展方法可能被認爲是一個壞主意。任何有力的理由爲什麼這是一個壞主意。不工作的IEnumerable(字符串)

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 

...模塊的其餘部分被剪短以便簡短。 Als爲Add,Cast和Apply for Action對象編寫了一些方法。

+0

你真的需要調用'params.AsEnumerable()',因爲它已經是'T()'類型了嗎? – 2009-10-17 11:43:43

回答

1

字符串是一個IEnumerable<char>,並有一個字符串,字符之間沒有關係。你可以把它看作是一個維度的問題,一個字符串通常可以被認爲是一個char數組。 char []不等於char,也不會。 System.String還實現了一個Concat方法,它可能會混淆你的類型簽名,所以你可能想小心一點。

+1

你說得對。這是String的Concat,它給了麻煩。在另一篇關於擴展方法的文章中發現它。 – 2009-10-17 14:37:03