Bagikan melalui


Cakupan nameof yang diperluas

Nota

Artikel ini adalah spesifikasi fitur. Spesifikasi berfungsi sebagai dokumen desain untuk fitur tersebut. Ini termasuk perubahan spesifikasi yang diusulkan, bersama dengan informasi yang diperlukan selama desain dan pengembangan fitur. Artikel ini diterbitkan sampai perubahan spesifikasi yang diusulkan diselesaikan dan dimasukkan dalam spesifikasi ECMA saat ini.

Mungkin ada beberapa perbedaan antara spesifikasi fitur dan implementasi yang selesai. Perbedaan tersebut dicatat dalam catatan terkait rapat desain bahasa (LDM) .

Anda dapat mempelajari lebih lanjut tentang proses untuk mengadopsi speklet fitur ke dalam standar bahasa C# dalam artikel tentang spesifikasi .

Masalah juara: https://github.com/dotnet/csharplang/issues/373

Ringkasan

Izinkan nameof(parameter) di dalam atribut pada metode atau parameter. Misalnya:

  • [MyAttribute(nameof(parameter))] void M(int parameter) { }
  • [MyAttribute(nameof(TParameter))] void M<TParameter>() { }
  • void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }

Motivasi

Atribut seperti NotNullWhen atau CallerExpression perlu merujuk ke parameter, tetapi parameter tersebut saat ini tidak berada dalam cakupan.

Desain terperinci

Metode

type_parameters metode berada dalam cakupan di seluruh method_declaration, dan dapat digunakan untuk membentuk jenis di seluruh cakupan tersebut dalam return_type, method_body, dan type_parameter_constraints_clauses tetapi tidak dalam atribut , kecuali dalam ekspresi nameof dalam atribut .

Parameter Metode

Deklarasi metode membuat ruang deklarasi terpisah untuk parameter, parameter jenis, dan variabel lokal. Nama dimasukkan ke dalam ruang deklarasi ini oleh daftar parameter jenis dan daftar parameter formal metode dan dengan deklarasi variabel lokal di blok metode . Nama dimasukkan ke dalam ruang deklarasi ini oleh daftar parameter jenis dan daftar parameter formal metode dalam ekspresi nameof dalam atribut yang ditempatkan pada metode atau parameternya.

[...]
Dalam blok metode, parameter formal dapat direferensikan oleh pengidentifikasi mereka dalam ekspresi simple_name (Nama sederhana). Dalam ekspresi nameof dalam atribut yang ditempatkan pada metode atau parameternya, parameter formal dapat direferensikan oleh pengidentifikasi mereka dalam ekspresi simple_name.

Tanda tangan fungsi anonim

Cakupan parameter fungsi anonim adalah ekspresi anonymous_function_body (ยง7,7) dan nameof dalam atribut yang ditempatkan pada fungsi anonim atau parameternya.

Deklarasi Delegasi

Lingkup parameter delegasi mencakup ekspresi nameof dalam atribut yang ditempatkan pada deklarasi, parameter jenisnya, atau parameter itu sendiri.

Nama sederhana

simple_name adalah salah satu bentuk I atau bentuk I<A1,...,Ak>, di mana I adalah pengidentifikasi tunggal dan <A1,...,Ak> adalah opsional type_argument_list. Ketika tidak ada type_argument_list yang ditentukan, pertimbangkan K menjadi nol. simple_name dievaluasi dan diklasifikasikan sebagai berikut:

  • Jika K adalah nol dan simple_name muncul dalam blok dan jika ruang deklarasi variabel lokal blok (atau blok penutup) (Deklarasi) berisi variabel lokal, parameter atau konstanta dengan nama I, maka simple_name mengacu pada variabel, parameter, atau konstanta lokal tersebut dan diklasifikasikan sebagai variabel atau nilai.
  • Jika K nol dan simple_name muncul dalam isi deklarasi metode generik dan jika deklarasi tersebut menyertakan parameter jenis dengan nama I, maka simple_name mengacu pada parameter jenis tersebut.
  • Jika K adalah nol dan simple_name muncul dalam ekspresi nameof dalam atribut pada deklarasi metode atau parameternya dan jika deklarasi tersebut menyertakan parameter parameter atau jenis dengan nama I, maka simple_name mengacu pada parameter atau parameter jenis tersebut.
  • Jika tidak, untuk setiap jenis instans T (Jenis instans), dimulai dengan jenis instans dari deklarasi tipe yang langsung menaungi dan melanjutkan ke jenis instans dari setiap deklarasi class atau struct (jika ada):
    [...]
  • Jika tidak, untuk setiap namespace N, dimulai dengan namespace di mana simple_name terjadi, berlanjut dengan setiap namespace yang melampirkan (jika ada), dan diakhiri dengan namespace global, langkah-langkah berikut dievaluasi hingga suatu entitas ditemukan:
    [...]
  • Jika tidak, simple_name tidak terdefinisi dan terjadi kesalahan waktu kompilasi.

Cakupan

  • Cakupan parameter jenis yang dideklarasikan oleh type_parameter_list pada method_declaration adalah ekspresi [...] dan nameof dalam atribut pada deklarasi metode atau parameternya.
  • Cakupan parameter yang dideklarasikan dalam method_declaration (Metode) adalah method_body ekspresi method_declaration dan nameof tersebut dalam atribut pada deklarasi metode atau parameternya.