Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka
Tento článek je specifikace funkce. Specifikace slouží jako návrhový dokument pro funkci. Zahrnuje navrhované změny specifikace spolu s informacemi potřebnými při návrhu a vývoji funkce. Tyto články se publikují, dokud nebudou navrhované změny specifikace finalizovány a začleněny do aktuální specifikace ECMA.
Mezi specifikací funkce a dokončenou implementací může docházet k nějakým nesrovnalostem. Tyto rozdíly jsou zachyceny v příslušných poznámkách schůzky o návrhu jazyka (LDM) .
Další informace o procesu přijetí specifikací funkcí do jazyka C# najdete v článku o specifikacích .
Problém šampiona: https://github.com/dotnet/csharplang/issues/7429
Shrnutí
Tento návrh upřesňuje určení přirozeného typu skupiny metod několika způsoby:
- Zvažte kandidátské metody v rámci jednotlivých oborů (nejprve metody instance, poté každý následný rozsah metod rozšíření).
- Vyřazení kandidátů, kteří nemají šanci uspět, takže nezasahují do určení jedinečného podpisu:
- Vyřazení obecných metod instance, pokud nejsou zadány žádné argumenty typu (
var x = M;
) - Omezit obecné metody rozšíření na základě možnosti snížení rozšíření a na základě omezení.
- Vyřazení obecných metod instance, pokud nejsou zadány žádné argumenty typu (
Kontext u přirozeného typu skupiny metod
V jazyce C# 10 získaly skupiny metod slabý přirozený typ.
Tento typ je "slabý typ" v tom, že přichází do hry pouze v případě, že skupina metod není určena typem cíle (tj. nehraje žádnou roli v System.Action a = MethodGroup;
).
Tento slabý přirozený typ umožňuje scénáře jako var x = MethodGroup;
.
Referenční informace: https://github.com/dotnet/csharplang/blob/main/proposals/csharp-10.0/lambda-improvements.md#natural-function-type
Skupina metod má přirozený typ, pokud všechny kandidátské metody ve skupině metod mají společný podpis. (Pokud skupina metod může zahrnovat rozšiřující metody, kandidáti zahrnují obsahující typ a všechny obory rozšiřujících metod.)
V praxi to znamená, že:
- Vytvořte sadu všech kandidátských metod:
- metody pro příslušný typ jsou v sadě, pokud jsou statické a příjemce je typ, nebo pokud nejsou statické a příjemce je hodnota.
- rozšiřující metody (napříč všemi obory), které lze omezit, jsou v sadě
- Pokud se podpisy všech kandidátů neshodují, skupina metod nemá přirozený typ.
- Pokud se arity výsledného podpisu neshoduje s počtem zadaných argumentů typu, skupina metod nemá přirozený typ.
- V opačném případě se výsledný podpis použije jako přirozený typ.
Návrh
Principem je postupovat rozsah po rozsahu a co nejdříve vyřadit kandidáty, o kterých víme, že nemohou uspět (stejný princip použitý v řešení přetížení funkcí).
- Pro každý obor vytvoříme sadu všech kandidátských metod:
- pro počáteční obor jsou metody příslušného typu s aritou odpovídající zadaným argumentům typu a vyhovující omezením se zadanými argumenty typu v sadě, pokud jsou statické a přijímač je typ, nebo pokud nejsou statické a přijímač je hodnota.
- pro další obory, rozšiřující metody v daném oboru, které lze nahradit zadanými argumenty typu a snížit pomocí hodnoty příjemce, zatímco vyhovující omezení jsou v sadě.
- Pokud v daném rozsahu nemáme žádné kandidáty, přejděte k dalšímu rozsahu.
- Pokud se podpisy všech kandidátů neshodují, skupina metod nemá přirozený typ.
- V opačném případě se výsledný podpis použije jako přirozený typ.
- Pokud jsou obory vyčerpány, skupina metod nemá přirozený typ.
Vztahuje se na návrh týkající se rozsahu: https://github.com/dotnet/csharplang/issues/7364 Vztahuje se na návrh, jak lépe zvládnout obecné metody rozšíření: https://github.com/dotnet/roslyn/issues/69222
C# feature specifications