直到今天,我认为以下两种符号相同(编辑: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
答案 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()