Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Kiterjesztett
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
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.
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.
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.
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.
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
Knulla, é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ótIné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
Knulla, és a simple_name egy általános metódusdeklaráció törzsében jelenik meg, és ha a deklaráció tartalmaz egyInevű típusparamétert, akkor a simple_name erre a típusparaméterre hivatkozik. -
Ha
Knulla, és a simple_name megjelenik egynameofkifejezé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étertIné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.
- 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
nameofkifejezéseire. - A method_declaration (metódusok) által deklarált paraméterek hatóköre az adott method_declaration method_body, és
nameofkifejezéseket a metódus deklarációján vagy paraméterein lévő attribútumban.
Kapcsolódó specifikációs szakaszok
C# feature specifications