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

时间:2015-01-11 03:06:35

标签: arrays vb.net declaration

直到今天,我认为以下两种符号相同(编辑:Dim已替换为Property

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

3 个答案:

答案 0 :(得分:5)

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

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

Dim data() As String

相同
Dim data As String()

如果你突出显示任何一个变量,那么intellisence会显示:

 Dim data() As String

答案 1 :(得分:0)

以下是复制问题所需的最少代码量:

Dim y As Object
Dim x = y(0)

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

答案 2 :(得分:0)

附加说明:

(不确定为什么会被投票)

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()