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)
问题是它们是属性,因此()作为数组说明符被忽略,并将其视为空参数集合.看一下编译器如何看待它们 - 即使编译器认为你有一个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)