arrayVariable() As Object 与 arrayVariable As Object() – 在 属性 声明中不一样?

arrayVariable() As Object vs. arrayVariable As Object() – not the same in Property declaration?

直到今天,我还认为以下两个符号是相同的(编辑:DimProperty 替换)

Property arrayVariable() As Object 
Property arrayVariable As Object()

今天我发现前者抛出错误 Option Strict On disallows late binding. 而后者在表达式 dictionary1.TryGetValue(CStr(arrayVariable(0)), result).

中编译正常

请问它们有什么区别?

如果第二种表示法也允许指定数组维度,我会一直使用它。它没有,所以我坚持使用第一种形式(不太干净的形式,因为类型规范的一部分 - 括号 - 在 As 之前)以便在声明之间保持一致。现在我发现即使是第一个也不是通用的...

看起来确实是 Visual Basic 的一个弱点,一件事存在两种形式,它们的用法并不简单,但有这样的问题。

重现问题的完整源代码:

Public Class Class1
    Dim _A1() As Object
    Dim _A2() As Object

    ReadOnly Property A1() As Object ' 1st form of declaration
        Get
            Return _A1
        End Get
    End Property

    ReadOnly Property A2 As Object() ' 2nd form of declaration
        Get
            Return _A2
        End Get
    End Property
End Class

Sub Main()
    Dim c1 As New Class1
    Dim d1 As New Dictionary(Of String, String)
    Dim value As String = ""
    d1.TryGetValue(CStr(c1.A1(0)), value)  '<- Option Strict On disallows late binding.
    d1.TryGetValue(CStr(c1.A2(0)), value)  '<- No error here.
End Sub

问题在于它们是属性,因此 () 作为数组说明符被忽略,并将其视为空参数集合。看看编译器如何看待它们 - 甚至编译器认为你有一个对象而不是 Object() 所以在你的例子中 A1(0) 是一个未定义的对象的索引所以它认为你有完成一些后期绑定并使其接受数组。

如果您未使用 属性 和对象类型,则任一声明均有效。

Dim data() As String

相同
Dim data As String()

如果您突出显示任一变量,智能会向您显示:

 Dim data() As String

这是复制您的问题所需的最少代码量:

Dim y As Object
Dim x = y(0)

这与数组声明无关。您只是想将 Object 转换为严格选项不允许的数组。

补充说明:

(不知道为什么这被否决了)

Object 更改为 Integer 表明问题中提到的第一种形式未被视为声明。

Public Class Class1
    Dim _A1 As Integer()
    Dim _A2 As Integer()

    ReadOnly Property A1() As Integer
        Get
            Return _A1 
          ' error at above line: Value of type '1-dimensional array of Integer' cannot
          ' be converted to 'Integer'.
        End Get
    End Property
    ReadOnly Property A2 As Integer()
        Get
            Return _A2
        End Get
    End Property
End Class

正确的做法是

    ReadOnly Property A1() As Integer()