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 b
a A0
je základní typ A
, pokud A
je nulovatelný typ hodnoty.
- Pokud
A
neexistuje nebo je nenulový typ hodnoty, dojde k chybě v době kompilace. - Pokud
B
není implicitně konvertibilní naA
neboA0
(pokudA0
existuje), dojde k chybě v době kompilace. - Pokud
A0
existuje aB
implicitně konvertibilní naA0
aB
není dynamický, typa ??= b
jeA0
.a ??= b
se vyhodnocuje za běhu jako:
Kromě toho, ževar tmp = a.GetValueOrDefault(); if (!a.HasValue) { tmp = b; a = tmp; } tmp
a
se vyhodnotí jenom jednou. - V opačném případě je typ
a ??= b
označen jakoA
.a ??= b
se vyhodnocuje za běhu jakoa ?? (a = b)
s tím rozdílem, žea
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
:
- 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:
- 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ý.
C# feature specifications