2011-03-07 116 views
1
''' <summary> 
''' Transforms an item to a list of single element containing this item. 
''' '</summary> 
<Extension()> _ 
Public Function ToList(Of T)(ByVal item As T) As List(Of T) 
    Dim tList As New List(Of T) 
    tList.Add(item) 
    Return tList 
End Function 

用法VB.NET擴展方法錯誤

Dim buttonControl As New System.Windows.Forms.Button 
Dim controls = buttonControl.ToList(Of System.Windows.Forms.Control)() 

編譯時間錯誤(在最後一行)

擴展方法「公共功能 ToList()作爲 System.Collections中。在'... Utils'中定義的'Generic.List(Of T)' 不是通用的 (或沒有自由類型參數)和 ,因此不能有類型參數。

是das?

回答

1

試試這個:

<Extension()> _ 
Public Function ToList(Of TItem, TList As {New, List(Of TItem)})(ByVal item As TItem) As TList 
    Dim tList As New TList 
    tList.Add(item) 
    Return tList 
End Function 

基本上你的返回類型是一個通用的(聲明爲(的T)列表)。這裏的函數decaration會這樣做,以便返回類型是正在擴展的類型的列表。

+0

如果我只是buttonControl.ToList()一切正常。但是,如果我嘗試從'Button'獲取'Control'的列表,則會顯示錯誤。 – serhio 2011-03-07 10:33:37

+1

我明白了。那麼在調用ToList(類似)之前將ButtonControl投射到控件上:(buttonControl as System.Windows.Forms.Control).ToList – 2011-03-07 10:39:32

+0

用您的示例,錯誤更改: 'Type argument'System.Windows.Forms.Control '不繼承或實現約束類型'System.Collections.Generic.List(Of System.Windows.Forms.Button)'。' – serhio 2011-03-07 10:40:00

0

試試這個。

<Extension()> 
    Public Function ToList(Of T)(ByVal Item As Object) As List(Of T) 
     Dim tlist1 As New List(Of T) 
     tlist1.Add(Item) 
     Return tlist1 
    End Function 
+0

這將使用拳擊和拆箱。不是非常優化。 – serhio 2011-03-08 11:02:29