拡張 nameof
スコープ
メモ
この記事は機能仕様についてです。 仕様は、機能の設計ドキュメントとして使用できます。 これには、提案された仕様の変更および機能の設計と開発時に必要な情報が含まれます。 これらの記事は、提案された仕様の変更が決定され、現在の ECMA 仕様に組み込まれるまで公開されます。
機能の仕様と行われた実装では、いくつかの違いがあることがあります。 これらの違いは、関連する言語設計ミーティング (LDM) メモに取り上げられています。
機能仕様を C# 言語標準に導入するプロセスの詳細については、仕様に関する記事を参照してください。
チャンピオンの課題: https://github.com/dotnet/csharplang/issues/373
まとめ
メソッドまたはパラメーターの属性内で 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
式です。
デリゲートのパラメータのスコープは、宣言、その型パラメータ、またはそのパラメータに配置された属性内の 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