擴充 nameof
範圍
注意
本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。
功能規格與已完成實作之間可能有一些差異。 這些差異是在的相關
總結
允許在方法或參數的屬性中使用 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
等屬性必須參考參數,但這些參數目前不在範圍內。
詳細設計
方法的
方法宣告會為參數、類型參數和局部變數建立個別的宣告空間。 名稱會由型別參數清單、方法的正式參數清單,以及方法區塊中的局部變數宣告導入此宣告空間。
名稱會透過類型參數清單和方法的正式參數清單,透過方法或其參數上的屬性中的 nameof
表達式,導入此宣告空間。
[...]
在方法的 區塊內,正式參數可以在simple_name表達式中由其標識元參考(簡單名稱)。
在方法或其參數的屬性中使用的 nameof
表達式裡,可以在 simple_name 表達式中,透過其識別碼來引用形式參數。
匿名函式的參數的範圍是匿名函式體(§7.7),其中包括放置在匿名函式或其參數上的屬性中
委派的參數範圍是在宣告、其型別參數或其參數上放置屬性中的 nameof
表達式。
simple_name 是I
的形式或是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。