Dot-Net
為什麼 List(Of T) 沒有 Count()?
Public Class MyList Inherits List(Of MyObject) Public ReadOnly Property SelectedCount() As Integer Get Return Me.Count(Function(obj) obj.IsSelected) End Get End Property End Class上面的程式碼會導致編譯時錯誤。如您所見,我正在嘗試使用擴展方法
Count(<predicate>)。我猜這個錯誤是因為List類本身也有一個類似名稱的屬性 Count,隱藏了擴展成員。我的問題是:
- 我是否需要將我的類顯式轉換為其他東西才能訪問
Count擴展方法?如果是這樣,在上面的場景中它到底應該是哪個類?- 為什麼編譯器不能從我指的是方法而不是屬性的用法中推斷出來?
- 考慮到這是一種大量使用的方法(有時可能每秒呼叫數百次),強制轉換是否涉及大量成本?
- 在這方面,C# 是否比 VB.NET 更好?
我正在使用 .NET 4.0 和 VS2010,如果這有關係的話。
編輯
錯誤資訊:
’
Public ReadOnly Property Count As Integer’ 沒有參數並且它的返回類型不能被索引。
呼叫沒有擴展方法語法的方法:
Public Class MyList Inherits List(Of MyObject) Public ReadOnly Property SelectedCount() As Integer Get Return Enumerable.Count(Me, Function(obj) obj.IsSelected) End Get End Property End Class確保您已將導入添加到 System.Linq。
- 您可以投射
Me到IEnumerable(Of MyObject):Return DirectCast(Me, IEnumerable(Of MyObject)).Count(Function(obj) obj.IsSelected)或者
Enumerable.Count()直接使用方法:Return Enumerable.Count(Me, Function(obj) obj.IsSelected)擴展方法由編譯器轉換為直接靜態(
shared在 VB 中)方法呼叫,因此沒有區別。 2. 不知道,真的。 3. 轉換為基礎類型不會改變對象本身,因此沒有性能損失(除非boxing涉及到,這裡不是這種情況)。 4. C# 不允許帶有參數的屬性,它需要在沒有 的情況下呼叫屬性(),所以是的,在這種情況下會更好。在 VB.NET 中
Me.Count(),Me.Count請參閱 ) 的Count屬性List(Of T。在 C#this.Count中將引用屬性並this.Count()引用擴展方法(因為括號)。