arrayVariable() As Object 与 arrayVariable As Object() – 在 属性 声明中不一样?
arrayVariable() As Object vs. arrayVariable As Object() – not the same in Property 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
问题在于它们是属性,因此 ()
作为数组说明符被忽略,并将其视为空参数集合。看看编译器如何看待它们 - 甚至编译器认为你有一个对象而不是 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()
直到今天,我还认为以下两个符号是相同的(编辑: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
问题在于它们是属性,因此 ()
作为数组说明符被忽略,并将其视为空参数集合。看看编译器如何看待它们 - 甚至编译器认为你有一个对象而不是 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()