Sdílet prostřednictvím


Operátor koalescenčního přiřazení v případě null

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 poznámkách schůze 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/34

Shrnutí

Zjednodušuje běžný vzor kódování, při kterém je proměnná přiřazena hodnota, pokud má hodnotu null.

V rámci tohoto návrhu také uvolníme požadavky týkající se typu pro ??, abychom umožnili výraz, jehož typ je neomezený parametr typu, který může být použit na levé straně.

Motivace

Běžně se zobrazuje kód formuláře.

if (variable == null)
{
    variable = expression;
}

Tento návrh přidá do jazyka, který tuto funkci provádí, nepřetížitelný binární operátor.

Pro tuto funkci bylo alespoň osm samostatných žádostí komunity.

Podrobný návrh

Přidáváme novou formu operátoru přiřazení.

assignment_operator
    : '??='
    ;

Která dodržuje stávající sémantická pravidla pro operátory složeného přiřazení (§12.21.4), s výjimkou toho, že přiřazení elidujeme, pokud je levá strana nenulová. Pravidla pro tuto funkci jsou následující.

a ??= b, kde A je typ a, B je typ ba A0 je základní typ A, pokud A je nulovatelný typ hodnoty.

  1. Pokud A neexistuje nebo je nenulový typ hodnoty, dojde k chybě v době kompilace.
  2. Pokud B není implicitně konvertibilní na A nebo A0 (pokud A0 existuje), dojde k chybě v době kompilace.
  3. Pokud A0 existuje a B implicitně konvertibilní na A0a B není dynamický, typ a ??= b je A0. a ??= b se vyhodnocuje za běhu jako:
    var tmp = a.GetValueOrDefault();
    if (!a.HasValue) { tmp = b; a = tmp; }
    tmp
    
    Kromě toho, že a se vyhodnotí jenom jednou.
  4. V opačném případě je typ a ??= b označen jako A. a ??= b se vyhodnocuje za běhu jako a ?? (a = b)s tím rozdílem, že a se vyhodnocuje jen jednou.

Pro uvolnění požadavků na typ ??aktualizujeme specifikaci, ve které se v současné době uvádí, že a ?? b, kde A je typ a:

  1. Pokud A existuje a není typu s možnou hodnotou null ani referenčního typu, dojde ke chybě při kompilaci.

Tento požadavek uvolníme na:

  1. Pokud hodnota A existuje a je typ hodnoty, která není nullable, dojde k chybě v době kompilace.

Toto umožňuje operátoru nulového sjednocení pracovat s neomezenými parametry typu, protože neomezený parametr typu T je přítomen, nepatří k typům, které mohou nabývat hodnoty null, a nejde o odkazový typ.

Nevýhody

Stejně jako u jakékoli funkce jazyka musíme položit otázku, jestli je větší složitost jazyka vrácena v další srozumitelnosti, kterou nabízí tělo programů jazyka C#, které by z této funkce mohly těžit.

Alternativy

Programátor může psát (x = x ?? y), if (x == null) x = y;nebo x ?? (x = y) rukou.

Nevyřešené otázky

  • [ ] Měli bychom také podporovat operátory &&= a ||=?

Návrhové schůzky

Žádný.