次の方法で共有


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

モチベーション

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

詳細な設計

メソッド

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