arrayVariable()As Object vs. arrayVariable As Object() - 在Property声明中不一样?

mir*_*lav 1 vb.net arrays declaration

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

Property arrayVariable() As Object 
Property arrayVariable As Object()
Run Code Online (Sandbox Code Playgroud)

今天我发现前者抛出错误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
Run Code Online (Sandbox Code Playgroud)

One*_*Day 5

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

如果您没有使用Property和Object类型,则声明有效.

Dim data() As String
Run Code Online (Sandbox Code Playgroud)

与...一样

Dim data As String()
Run Code Online (Sandbox Code Playgroud)

如果您突出显示任一变量,则intellisence会显示:

 Dim data() As String
Run Code Online (Sandbox Code Playgroud)