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

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 では次のようになります。

このコンテキストでは、型宣言文字は無効です。

仕様に何か欠けているのでしょうか、それともコンパイラが仕様に同意していませんか?

4

2 に答える 2

3

文法はそれ自体では成り立たず、記述テキストは仕様の一部です。そうでなければあなたは正しいので、これはここで重要です。しかし、Company_tech が彼の回答で述べているように、プロダクションは、プロダクションTypeCharacterの一部を形成している間、変数 (または関数) の型を示すことを除いて、識別子の有効な文字ではありません。Identifier

これは 2.2.1 で指定されています。

タイプ文字は、先行する識別子のタイプを示します。タイプ文字は、識別子の一部とは見なされません。宣言に型文字が含まれる場合、型文字は宣言自体で指定された型と一致する必要があります。そうしないと、コンパイル時エラーが発生します。

概念的に型を持たない識別子 (名前空間名など) に型文字を追加するか、型文字の型と一致しない型を持つ識別子に型文字を追加すると、コンパイル時エラーが発生します。

(私のものを強調してください。)

このセクションでは、あなたの使用と同等の無効な使用の明示的な例も示しています。したがって、仕様はこれを明示的に禁止しています。

于 2013-07-16T23:17:01.810 に答える