gpt4 book ai didi

vb.net - 为什么 (An Object).A Field = A Value 是 VB.NET 中的语法错误?

转载 作者:行者123 更新时间:2023-12-03 06:54:02 25 4
gpt4 key购买 nike

编辑:修改代码示例以显式声明函数的返回类型。

<小时/>

考虑以下最小示例:

Class AClass
Public AField As Integer

Public Sub New(aField As Integer)
Me.AField = aField
End Sub

Public Function AMethod() As Integer
Return AField
End Function
End Class

Module AModule

Sub Main()

Dim AnObject As AClass = New AClass(12)

Dim n As Integer = (AnObject).AField ' This is fine

Dim m As Integer = (AnObject).AMethod() ' This is fine

(AnObject).AField = 8 ' BC30035 Syntax Error

AnObject.AField = 8 ' This is fine

End Sub

End Module

VB.NET 的语法如何工作,这两种情况之间存在差异?看起来,如果我们正在调用一个方法,或者读取一个字段,则允许使用括号,但如果我们写入一个字段,则不允许使用括号。

我尝试查看 Visual Basic Language Reference但我没有看到任何正式语法之类的东西。我也尝试过用谷歌搜索这个,尽管想出一组好的搜索关键字有点困难。

<小时/>

更新

所以我查看了 Jimi 链接的语言语法,我更加困惑了 - 特别是我们有

RegularAssignmentStatement  ::=  Expression  Equals  Expression  StatementTerminator

Expression ::= SimpleExpression | MemberAccessExpression | ...

MemberAccessExpression ::=
[ MemberAccessBase ] Period IdentifierOrKeyword
[ OpenParenthesis Of TypeArgumentList CloseParenthesis ]

MemberAccessBase ::= Expression | ...

SimpleExpression ::= LiteralExpression |
ParenthesizedExpression |
SimpleNameExpression |
...

SimpleNameExpression ::= Identifier [ OpenParenthesis Of TypeArgumentList CloseParenthesis ]

ParenthesizedExpression ::= OpenParenthesis Expression CloseParenthesis

根据这个语法,这不是语法错误!具体来说,

  • AnObject 是一个标识符,因此是一个 SimpleNameExpression,因此是一个简单表达式,因此是一个表达式。 (我没有在这里包含标识符的定义,但根据文档,字母字符的字符串绝对符合条件。)
  • 因此,(AnObject) 是一个 ParenthesizedExpression,因此是一个 SimpleExpression,因此是一个 Expression,因此是一个 MemberAccessBase。
  • AField 是一个标识符。
  • 将这两者放在一起,(AnObject).AField 是一个 MemberAccessExpression,因此是一个表达式
  • 8 是一个 LiteralExpression,因此是一个表达式
  • 行尾的换行符是StatementTerminator
  • 因此,根据此语法,(AnObject).AField = 8 是一个 RegularAssignmentStatement。

所以,根据文档,这个语句应该可以解析!

最佳答案

我纯粹是猜测,但我想说这是 VB 的 force value over reference passing by using parentheses 功能的产物。 :

Sub ChangeMe(ByRef x As Integer)
x += 1
End Sub

Dim x = 1
ChangeMe(x) ' x = 2
ChangeMe((x)) ' still x = 2

在您的代码中,编译器可能会将 (AnObject) 视为,而不是对原始对象的引用,因此确定对字段的赋值将是被丢弃,并且不允许分配。

当然,即使按值将 AnObject 传递给方法,修改 AnObject.Field 仍然会修改原始对象。因此,以此类推,代码应该可以工作。我猜测 VB 编译器在这里应用了错误的启发式方法。

关于vb.net - 为什么 (An Object).A Field = A Value 是 VB.NET 中的语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49806479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com