Koaleszierende NULL-Zuweisungnull coalescing assignment

  • [x] vorgeschlagen[x] Proposed
  • [x] Prototyp: abgeschlossen[x] Prototype: Completed
  • [x] Implementierung: abgeschlossen[x] Implementation: Completed
  • [x] Spezifikation: unten[x] Specification: Below

ZusammenfassungSummary

Vereinfacht ein gängiges Codierungs Muster, bei dem einer Variablen ein Wert zugewiesen wird, wenn Sie NULL ist.Simplifies a common coding pattern where a variable is assigned a value if it is null.

Im Rahmen dieses Angebots lockern wir auch die typanforderungen auf ?? , damit ein Ausdruck, dessen Typ ein uneingeschränkter Typparameter ist, auf der linken Seite verwendet werden kann.As part of this proposal, we will also loosen the type requirements on ?? to allow an expression whose type is an unconstrained type parameter to be used on the left-hand side.

MotivationMotivation

Es kommt häufig vor, dass Code des Formulars angezeigt wird.It is common to see code of the form

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

In diesem Vorschlag wird der Sprache, die diese Funktion ausführt, ein nicht über ladbarer binärer Operator hinzugefügt.This proposal adds a non-overloadable binary operator to the language that performs this function.

Für dieses Feature gab es mindestens acht communityanforderungen.There have been at least eight separate community requests for this feature.

Detaillierter EntwurfDetailed design

Wir fügen eine neue Form von Zuweisungs Operatoren hinzu.We add a new form of assignment operator

assignment_operator
    : '??='
    ;

Der den vorhandenen Semantik Regeln für Verbund Zuweisungs Operatorenfolgt, mit dem Unterschied, dass die Zuweisung entfernt wird, wenn die linke Seite nicht NULL ist.Which follows the existing semantic rules for compound assignment operators, except that we elide the assignment if the left-hand side is non-null. Die Regeln für dieses Feature lauten wie folgt.The rules for this feature are as follows.

Gibt an a ??= b , wobei A der Typ von a , B der Typ von b und A0 der zugrunde liegende Typ von ist, A Wenn A ein Werte zulässt-Werttyp ist:Given a ??= b, where A is the type of a, B is the type of b, and A0 is the underlying type of A if A is a nullable value type:

  1. Wenn A nicht vorhanden ist oder ein nicht auf NULL festleg barer Werttyp ist, tritt ein Kompilierzeitfehler auf.If A does not exist or is a non-nullable value type, a compile-time error occurs.
  2. Wenn B nicht implizit in A oder A0 (falls A0 vorhanden) konvertiert werden kann, tritt ein Kompilierzeitfehler auf.If B is not implicitly convertible to A or A0 (if A0 exists), a compile-time error occurs.
  3. Wenn A0 vorhanden und B implizit in konvertierbar ist A0 und B nicht dynamisch ist, ist der Typ von a ??= b A0 .If A0 exists and B is implicitly convertible to A0, and B is not dynamic, then the type of a ??= b is A0. a ??= b wird zur Laufzeit wie folgt ausgewertet:a ??= b is evaluated at runtime as:
    var tmp = a.GetValueOrDefault();
    if (!a.HasValue) { tmp = b; a = tmp; }
    tmp
    
    Mit der Ausnahme, dass a nur einmal ausgewertet wird.Except that a is only evaluated once.
  4. Andernfalls ist der Typ von a ??= b A .Otherwise, the type of a ??= b is A. a ??= b wird zur Laufzeit als ausgewertet a ?? (a = b) , mit dem Unterschied, dass a nur einmal ausgewertet wird.a ??= b is evaluated at runtime as a ?? (a = b), except that a is only evaluated once.

Um die typanforderungen von zu erfüllen ?? , aktualisieren wir die Spezifikation, in der Sie aktuell angibt, a ?? b wo A der Typ von ist a :For the relaxation of the type requirements of ??, we update the spec where it currently states that, given a ?? b, where A is the type of a:

  1. Wenn ein vorhanden ist und kein Werte zulässt-Typ oder Verweistyp ist, tritt ein Kompilierzeitfehler auf.If A exists and is not a nullable type or a reference type, a compile-time error occurs.

Wir lockern diese Anforderung für Folgendes:We relax this requirement to:

  1. Wenn eine vorhanden ist und ein Werttyp ist, der keine NULL-Werte zulässt, tritt ein Kompilierzeitfehler auf.If A exists and is a non-nullable value type, a compile-time error occurs.

Dadurch kann der NULL-Sammel Operator an nicht eingeschränkten Typparametern arbeiten, da der nicht eingeschränkte Typparameter T vorhanden ist, kein Werte zulässt-Typ ist und kein Referenztyp ist.This allows the null coalescing operator to work on unconstrained type parameters, as the unconstrained type parameter T exists, is not a nullable type, and is not a reference type.

NachteileDrawbacks

Wie bei allen Sprach Features müssen wir Fragen, ob die zusätzliche Komplexität der Sprache in der zusätzlichen Klarheit für den Text der c#-Programme, die von der Funktion profitieren würden, zurückgegeben wird.As with any language feature, we must question whether the additional complexity to the language is repaid in the additional clarity offered to the body of C# programs that would benefit from the feature.

AlternativenAlternatives

Der Programmierer kann (x = x ?? y) , if (x == null) x = y; oder x ?? (x = y) per Hand schreiben.The programmer can write (x = x ?? y), if (x == null) x = y;, or x ?? (x = y) by hand.

Nicht aufgelöste FragenUnresolved questions

  • [] Erfordert eine LDM-Überprüfung[ ] Requires LDM review
  • [] Sollten auch &&= -und- ||= Operatoren unterstützt werden?[ ] Should we also support &&= and ||= operators?

Treffen von BesprechungenDesign meetings

Keine.None.