拡張 nameof
スコープ
手記
この記事は機能仕様です。 仕様は、機能の設計ドキュメントとして機能します。 これには、提案された仕様の変更と、機能の設計と開発時に必要な情報が含まれます。 これらの記事は、提案された仕様の変更が最終決定され、現在の ECMA 仕様に組み込まれるまで公開されます。
機能の仕様と完成した実装の間には、いくつかの違いがある可能性があります。 これらの違いは、関連する 言語設計会議 (LDM) ノートでキャプチャされます。
機能仕様を C# 言語標準に導入するプロセスの詳細については、仕様に関する記事を参照してください。
概要
メソッドまたはパラメーターの属性内で nameof(parameter)
を許可します。
例えば:
[MyAttribute(nameof(parameter))] void M(int parameter) { }
[MyAttribute(nameof(TParameter))] void M<TParameter>() { }
void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }
モチベーション
NotNullWhen
や CallerExpression
などの属性はパラメーターを参照する必要がありますが、これらのパラメーターは現在スコープ内にありません。
詳細な設計
メソッドの type_parameters は、method_declaration全体でスコープ内にあり、return_type、method_body、および type_parameter_constraints_clauses 内でそのスコープ全体で型を形成するために使用できますが、属性の nameof
式内を除き、属性では使用できません。
メソッド宣言では、パラメーター、型パラメーター、およびローカル変数用に個別の宣言空間が作成されます。 この宣言空間には、メソッドの型パラメーター リストと仮パラメーター リスト、およびメソッドのブロック内のローカル変数宣言によって、名前が導入されます。
名前は、メソッドまたはそのパラメータに配置された属性の nameof
式内のメソッドの型パラメーター リストおよび仮パラメーター リストによってこの宣言空間に導入されます。
[...]
メソッドのブロック内では、仮パラメーターは、simple_name式 (単純名) 内の識別子によって参照できます。
メソッドまたはそのパラメーターに配置された属性の nameof
式内で、仮パラメーターは、simple_name 式内の識別子によって参照できます。
匿名関数のパラメーターのスコープは、匿名関数またはそのパラメーターに配置された属性のanonymous_function_body (§7.7)
デリゲートのパラメーターのスコープは、宣言、その型パラメーター、またはそのパラメーターに配置された属性の nameof
式です。
simple_name は、フォーム I
またはフォーム I<A1,...,Ak>
のいずれかです。ここで、I
は 1 つの識別子であり、<A1,...,Ak>
は省略可能な type_argument_listです。 type_argument_list が指定されていない場合は、K
を 0 にすることを検討してください。 simple_name は次のように評価され、分類されます。
K
が 0 で、simple_name がブロック内に表示され、ブロック (または外側のブロックの) ローカル変数宣言空間 (宣言) にローカル変数、パラメーター、または名前I
定数が含まれている場合、simple_name はそのローカル変数、パラメーター、または定数を参照し、変数または値として分類されます。K
が 0 で、simple_name がジェネリック メソッド宣言の本体内に表示され、その宣言に名前がI
型パラメーターが含まれている場合、simple_name はその型パラメーターを参照します。K
が 0 で、simple_name がメソッド宣言またはそのパラメーターの属性のnameof
式内に表示され、その宣言に名前I
を持つパラメーターまたは型パラメーターが含まれている場合、simple_name はそのパラメーターまたは型パラメーターを参照します。- それ以外の場合は、各インスタンス型
T
(インスタンス型) に対して、すぐに外側の型宣言のインスタンス型から始まり、外側の各クラスまたは構造体宣言のインスタンス型 (存在する場合) を続行します。
[...] - それ以外の場合は、
N
において simple_name が発生する名前空間から始め、外側の各名前空間(存在する場合)を順に辿って、グローバル名前空間で終わるまで、エンティティが見つかるまで次の手順を評価します。
[...] - それ以外の場合、simple_nameは未定義であり、コンパイル時エラーが発生します。
- method_declaration の type_parameter_list によって宣言された型パラメータのスコープは、メソッド宣言またはそのパラメータの属性内の [...] および
nameof
式です。 - method_declaration (メソッド) で宣言されたパラメータのスコープは、メソッド宣言またはそのパラメータの属性内のその method_declaration の および
nameof
式の method_body です。
関連する仕様セクション
C# feature specifications