我正在努力解决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提供了这个:
类型声明字符在此上下文中无效。
我是否遗漏了规范中的内容,或者编译器是否不同意规范?
答案 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
由于类没有数据类型,因此添加类型标识符没有任何意义。基于此,似乎规范可能不完全正确。