2017-08-31 67 views
1

以下代碼會產生令人困惑的結果。注意我來自C#背景,知道很少的VB。無法在列表上調用計數(謂詞)

Module Module1 
Sub Main() 
    Dim list As List(Of String) = New List(Of String)() 
    Dim result As Integer 

    result = list.Count() '1 
    result = list.Count(Function(p) True) '2 
    result = CType(list, IEnumerable(Of String)).Count(Function(p) True) '3 
End Sub 
End Module 

混亂的位:

  1. 有一個屬性命名計數和具有相同名稱的擴展方法。通過調用Count()我希望調用擴展方法,但是該屬性被訪問。爲什麼以及如何調用一個方法?

  2. 我期望的擴展方法調用,但編譯失敗與BC32016(就像如果屬性被訪問,而不是方法)。這是爲什麼?

  3. 這按預期工作。

+1

它只是從VB6繼承的VB.Net語法,其中'result = list.Count'或'result = list.Count()'都會訪問一個屬性。當兩者都存在於VB.Net中時,該屬性總是被選中(只要該方法具有無參數過載)。 c#對此更明確,'result = list.Count;'或'result = list.Count();'將分別訪問屬性或方法。 – djv

回答

1

我認爲這是VB的限制,因爲這樣做不能編譯。 A已經是一個屬性,不能有一個同名的方法。

Class Test 

    Public Property A As Integer 

    Public Function A(ByVal b As String) As Integer 
     Return 0 
    End Function 

End Class 

您還有其他的選擇。

Enumerable.Count(list, Function(p) True) 
    list.AsEnumerable.Count(Function(p) True) 
+0

'Count'是'List '和'int Count (此IEnumerable 源)的只讀屬性''是Enumerable的擴展方法。嘗試在單個類中定義屬性和方法不適用。 – djv

+0

但是,列出的「其他選項」沒有問題 – djv