VB中的法定类名? Spec建议`class foo!`应该是合法的

时间:2013-07-16 22:29:03

标签: vb.net syntax

我正在努力解决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

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

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提供了这个:

  

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

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

2 个答案:

答案 0 :(得分:3)

语法本身并不存在,描述文本是规范的一部分。这在这里很重要,因为否则你是对的。但正如competent_tech在他的回答中所指出的那样,TypeCharacter制作,同时构成Identifier制作的一部分,不是标识符中的有效字符 - 除外< / em>表示变量(或函数)的类型。

这在2.2.1中指定:

  

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

     

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

(强调我的。)

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

答案 1 :(得分:2)

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

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

End Class

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