共用方式為


擴充 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_bodytype_parameter_constraints_clauses 中形成類型,但無法在屬性中形成類型,除了在 屬性中的 表示式之外,

方法參數

方法宣告會為參數、類型參數和局部變數建立個別的宣告空間。 名稱會由型別參數清單、方法的正式參數清單,以及方法區塊中的局部變數宣告導入此宣告空間。 名稱會透過類型參數清單和方法的正式參數清單,透過方法或其參數上的屬性中的 nameof 表達式,導入此宣告空間。

[...]
在方法的 區塊內,正式參數可以在simple_name表達式中由其標識元參考(簡單名稱)。 在方法或其參數的屬性中使用的 nameof 表達式裡,可以在 simple_name 表達式中,透過其識別碼來引用形式參數。

匿名函式簽章

匿名函式的參數的範圍是匿名函式體(§7.7),其中包括放置在匿名函式或其參數上的屬性中 表達式。

委託宣告

委派的參數範圍是在宣告、其型別參數或其參數上放置屬性中的 nameof 表達式。

簡單名稱

simple_nameI 的形式或是I<A1,...,Ak>的形式,其中 I 是單一識別字,<A1,...,Ak> 是可選的類型參數列表。 未指定任何 type_argument_list 時,K 預設為零。 simple_name 將依照以下方式進行評估與分類:

  • 如果 K 為零,且 simple_name 出現在區塊內,且區塊的 (或封入區塊的) 局部變數宣告空間 (Declarations) 包含局部變數、參數或名稱為 I的常數,則 simple_name 會參考該局部變數、參數或常數,並分類為變數或值。
  • 如果 K 為零,且 simple_name 會出現在泛型方法宣告的主體內,如果該宣告包含名稱為 I的類型參數,則 simple_name 會參考該類型參數。
  • 如果 K 為零,而且 simple_name 出現在方法宣告或其參數屬性的 nameof 表達式中,如果該宣告包含名稱為 I的參數或類型參數,則 simple_name 會參考該參數或類型參數。
  • 否則,針對每個實例類型 T(實例類型),從立即封閉型別聲明的實例類型開始,然後繼續處理每個包含類別或結構聲明的實例類型(如果有):
    [...]
  • 否則,針對每個命名空間 N,從包含 simple_name 的命名空間開始,然後繼續每個外層的名稱空間(如果有的話),直到全域名稱空間結束,會依次評估以下步驟,直到找到實體為止:
    [...]
  • 否則,simple_name未定義,而且會發生編譯時期錯誤。

範圍

  • type_parameter_list在method_declaration上宣告的類型參數的範圍是方法宣告或其參數的屬性中的 nameof 表達式。
  • 在method_declaration中宣告的參數範圍是方法宣告或其參數屬性中該method_declaration nameof 表達式的 method_body