Megosztás a következőn keresztül:


Kiterjesztett nameof hatókör

Jegyzet

Ez a cikk egy funkcióspecifikáció. A specifikáció a funkció tervezési dokumentumaként szolgál. Tartalmazza a specifikáció javasolt módosításait, valamint a funkció tervezése és fejlesztése során szükséges információkat. Ezeket a cikkeket mindaddig közzéteszik, amíg a javasolt specifikációmódosításokat nem véglegesítik, és be nem építik a jelenlegi ECMA-specifikációba.

A szolgáltatás specifikációja és a befejezett implementáció között eltérések lehetnek. Ezeket a különbségeket a vonatkozó nyelvi tervezési értekezlet (LDM) megjegyzései rögzítik.

A funkcióspektusok C# nyelvi szabványba való bevezetésének folyamatáról a specifikációkcímű cikkben olvashat bővebben.

Bajnoki probléma: https://github.com/dotnet/csharplang/issues/373

Összefoglalás

nameof(parameter) engedélyezése egy metóduson vagy paraméteren lévő attribútumon belül. Például:

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

Motiváció

Az olyan attribútumoknak, mint NotNullWhen vagy CallerExpression paraméterekre kell hivatkoznia, de ezek a paraméterek jelenleg nincsenek hatókörben.

Részletes kialakítás

módszerek

A metódus type_parameters a method_declarationhatókörében találhatók, és return_type, method_bodyés type_parameter_constraints_clauses, de nem attribútumokban, kivéve nameofattribútumokban.

Metódusparaméterek

A metódusdeklaráció külön deklarációs területet hoz létre a paraméterek, a típusparaméterek és a helyi változók számára. A neveket a metódus típusparaméter-listája és formális paraméterlistája, valamint a metódus blokkjában lévő helyi változódeklarációk vezetik be ebbe a deklarációs területre. A neveket ebbe a deklarációs térbe a metódus típusparaméter-listája és a formális paraméterlista vezeti be az attribútumokban, amelyek a metódusra vagy annak paramétereire helyezett nameof kifejezések.

[...]
A metódus blokkjában a formális paraméterekre simple_name kifejezések (egyszerű nevek) azonosítói hivatkozhatnak. A metódusra vagy annak paramétereire helyezett attribútumokban lévő nameof kifejezésen belül a formális paraméterekre azonosítóikra lehet hivatkozni simple_name kifejezésekben.

Névtelen függvénykódok

A névtelen függvény paramétereinek hatóköre a névtelen_függvény_törzsre (7.7. §) korlátozódik, és a függvényen vagy annak paraméterein elhelyezett attribútumokban szereplő és nameof kifejezésekre is érvényes.

Delegált deklarációk

A delegált paramétereinek hatóköre azokra a kifejezésekre terjed ki, amelyek a deklaráción elhelyezett attribútumokban, annak típusparamétereiben vagy paramétereiben találhatók nameof.

Egyszerű nevek

A simple_name vagy a I formájában, vagy a I<A1,...,Ak>formájában létezik, ahol a I egyetlen azonosító, a <A1,...,Ak> pedig egy választható típus_argumentum_lista. Ha nincs megadva type_argument_list, vegye figyelembe, hogy K nulla. A simple_name kiértékelése és besorolása az alábbiak szerint történik:

  • Ha a K nulla, és a simple_name egy blokkon belül jelenik meg, és ha a blokk (vagy a blokk egy része) helyi változó deklarációs területe (Deklarációk) tartalmaz egy helyi változót, paramétert vagy állandót Inévvel, akkor a simple_name erre a helyi változóra, paraméterre vagy állandóra hivatkozik, és változóként vagy értékként van besorolva.
  • Ha K nulla, és a simple_name egy általános metódusdeklaráció törzsében jelenik meg, és ha a deklaráció tartalmaz egy Inevű típusparamétert, akkor a simple_name erre a típusparaméterre hivatkozik.
  • Ha K nulla, és a simple_name megjelenik egy nameof kifejezésben a metódus deklarációjának vagy paramétereinek egyik attribútumában, és ha a deklaráció tartalmaz egy paramétert vagy típusparamétert Inévvel, akkor a simple_name erre a paraméterre vagy típusparaméterre hivatkozik.
  • Ellenkező esetben minden egyes példánytípus esetében T (A példány típusa), kezdve az azonnal magában foglaló típusdeklaráció példánytípusával, és folytatva az egyes belefoglaló osztályok vagy szerkezetdeklarációk példánytípusával (ha van):
    [...]
  • Ellenkező esetben minden névtér N, kezdve azzal a névtérrel, amelyben a simple_name bekövetkezik, az egyes beágyazó névtérekkel folytatva (ha van ilyen), és a globális névtérrel végződik, a rendszer a következő lépéseket értékeli ki, amíg egy entitás nem található:
    [...]
  • Ellenkező esetben a simple_name nincs definiálva, és fordítási időhiba lép fel.

hatókörök

  • A metódusdeklaráció típusparaméterlistája által deklarált típusparaméter hatóköre kiterjed [...] a metódus deklarációján vagy annak paraméterein lévő attribútum és nameof kifejezéseire.
  • A method_declaration (metódusok) által deklarált paraméterek hatóköre az adott method_declaration method_body, és nameof kifejezéseket a metódus deklarációján vagy paraméterein lévő attribútumban.