2017-08-31 64 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