2

教科書の質問ですが、グーグルをしてしまい、何も見つかりませんでした。

という名前のカスタム属性が与えられたSomeAttribute場合、VB.NETで次のことをどのように行いますか?

void SomeMethod<[Some] T>()
{
}

私はこれを試しました:

Sub SomeMethod(<Some> Of T)()
End Sub

Sub SomeMethod(Of <Some> T)()
End Sub

しかし、どちらもコンパイルに失敗し、エラーが。を指してい<Some>ます。

4

1 に答える 1

4

ここでの沈黙を考えると、そして私は本当に答えが必要だったので、私はVB.NET言語仕様を掘り下げました。

これがサポートされているかどうかを明示的に示すことはありませんが、VB.NETでサポートされていないことを示唆する正式な文法定義がいくつかあります。

具体的には、セクション9.2.1は、メソッド宣言の次のプロダクションを定義しています。

SubSignature  ::=  Sub  Identifier  [  TypeParameterList  ]
    [  OpenParenthesis  [  ParameterList  ]  CloseParenthesis  ]

9.2.5では、パラメーターは次のように定義されています。

ParameterList  ::=
    Parameter  |
    ParameterList  Comma  Parameter

Parameter  ::=
    [  Attributes  ]  [  ParameterModifier+  ]  ParameterIdentifier  [  As  TypeName  ]
            [  Equals  ConstantExpression  ]

そしてセクション13.3は定義しますTypeParameterList

TypeParameterList  ::=
    OpenParenthesis  Of  TypeParameters  CloseParenthesis

TypeParameters  ::=
    TypeParameter  |
    TypeParameters  Comma  TypeParameter

TypeParameter  ::=
    [  VarianceModifier  ]  Identifier  [  TypeParameterConstraints  ]

VarianceModifier  ::=
    In  |  Out

TypeParameterConstraints  ::=
    As  Constraint  |
    As  OpenCurlyBrace  ConstraintList  CloseCurlyBrace

ConstraintList  ::=
    ConstraintList  Comma  Constraint  |
    Constraint

Constraint  ::=  TypeName  |  New  |  Structure  |  Class

属性はパラメーターリスト(および関数の場合は戻り型)に表示されますが、TypeParameterListには属性に関連するものがまったくありません。

したがって、先に進んで、VB.NET 10(VS2012に同梱)はジェネリック型パラメーターの属性をサポートしていないと主張します。

于 2013-03-12T17:57:16.640 に答える