Sdílet prostřednictvím


Vylepšení přirozeného typu skupiny metod

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:

  1. Zvažte kandidátské metody v rámci jednotlivých oborů (nejprve metody instance, poté každý následný rozsah metod rozšíření).
  2. 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í.

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:

  1. 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ě
  1. Pokud se podpisy všech kandidátů neshodují, skupina metod nemá přirozený typ.
  2. Pokud se arity výsledného podpisu neshoduje s počtem zadaných argumentů typu, skupina metod nemá přirozený typ.
  3. 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í).

  1. 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ě.
  1. Pokud v daném rozsahu nemáme žádné kandidáty, přejděte k dalšímu rozsahu.
  2. Pokud se podpisy všech kandidátů neshodují, skupina metod nemá přirozený typ.
  3. V opačném případě se výsledný podpis použije jako přirozený typ.
  4. 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