次の方法で共有


拡張 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) { }

目的

NotNullWhenCallerExpression などの属性はパラメーターを参照する必要がありますが、これらのパラメーターは現在スコープ内にありません。

詳細な設計

メソッド

メソッドの type_parametersmethod_declaration 全体のスコープ内にあり、return_typemethod_bodytype_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 です。