3

我正在努力解决似乎是 Visual Basic 中的错误。我可能错过了一些东西。希望有人能指出它是什么。

10.0 版的 Visual Basic 规范第 7.5 节说这是类声明的语法。请原谅缺少指示文字和语法节点之间差异的斜体。

ClassDeclaration  ::=
    [  Attributes  ]  [  ClassModifier+  ]  Class  Identifier  [  TypeParameterList  ]  StatementTerminator
    [  ClassBase  ]
    [  TypeImplementsClause+  ]
    [  ClassMemberDeclaration+  ]
    End  Class  StatementTerminator
ClassModifier  ::=  TypeModifier  |  MustInherit  |  NotInheritable  |  Partial

所以最小的类声明将是

Class Identifier StatementTerminator
End  Class  StatementTerminator

13.1.2 中指定了语法Identifier和其他一些支持节点,

Identifier  ::=
    NonEscapedIdentifier  [  TypeCharacter  ]  |
    Keyword  TypeCharacter  |
    EscapedIdentifier

NonEscapedIdentifier  ::=  < IdentifierName but not Keyword >

TypeCharacter  ::=
    IntegerTypeCharacter  |
    LongTypeCharacter  |
    DecimalTypeCharacter  |
    SingleTypeCharacter  |
    DoubleTypeCharacter  |
    StringTypeCharacter

IntegerTypeCharacter  ::=  %
LongTypeCharacter  ::=  &
DecimalTypeCharacter  ::=  @
SingleTypeCharacter  ::=  !
DoubleTypeCharacter  ::=  #
StringTypeCharacter  ::=  $

根据我的阅读,这foo!应该是一个合法的标识符,因为!它是一个TypeCharacter.

所以,根据上面的最小合法类声明,这应该是合法的。

Class foo!
End Class

但是 Visual Studio 2010 给出了这个:

类型声明字符在此上下文中无效。

我是否遗漏了规范中的某些内容,或者编译器是否不同意规范?

4

2 回答 2

3

语法不是独立存在的,描述文本是规范的一部分。这在这里很重要,因为否则你是对的。但正如主管技术在他的回答中指出的那样,TypeCharacter产生式虽然构成产生式的一部分,但Identifier不是标识符中的有效字符——除了表示变量(或函数)的类型。

这在 2.2.1 中指定:

类型字符表示前面标识符的类型。类型字符不被视为标识符的一部分。如果声明包含类型字符,则类型字符必须与声明本身指定的类型一致;否则,会发生编译时错误。

将类型字符附加到概念上没有类型的标识符(例如,命名空间名称)或类型与类型字符的类型不一致的标识符会导致编译时错误。

(强调我的。)

该部分甚至给出了与您的使用等效的无效使用的明确示例。所以规范明确禁止这样做。

于 2013-07-16T23:17:01.810 回答
2

TypeIdentifier 用于声明属性、变量、函数等的数据类型。

Public Class Foo
    Dim x!
    ' The above declaration is the same as 
    'Dim x As Single

End Class

由于类没有数据类型,添加类型标识符没有任何意义。基于此,该规范似乎并不完全正确。

于 2013-07-16T23:04:05.237 回答