Partager via


Attribution de fusion Null

Remarque

Cet article est une spécification de fonctionnalité. La spécification sert de document de conception pour la fonctionnalité. Il inclut les modifications de spécification proposées, ainsi que les informations nécessaires pendant la conception et le développement de la fonctionnalité. Ces articles sont publiés jusqu’à ce que les modifications de spécification proposées soient finalisées et incorporées dans la spécification ECMA actuelle.

Il peut y avoir des différences entre la spécification de la fonctionnalité et l’implémentation terminée. Ces différences sont consignées dans les notes pertinentes de la réunion de conception linguistique (LDM).

Vous pouvez en savoir plus sur le processus d’adoption des speclets de fonctionnalités dans la norme de langage C# dans l’article sur les spécifications .

Résumé

Simplifie un modèle de codage courant où une variable est affectée à une valeur s’il s’agit de null.

Dans le cadre de cette proposition, nous allons également relâcher les exigences de type sur ?? pour permettre à une expression dont le type est un paramètre de type non contraint pouvant être utilisé sur le côté gauche.

Motivation

Il est courant de voir le code du formulaire

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

Cette proposition ajoute un opérateur binaire non surchargé au langage qui exécute cette fonction.

Il y a eu au moins huit demandes de communauté distinctes pour cette fonctionnalité.

Conception détaillée

Nous ajoutons une nouvelle forme d’opérateur d’affectation

assignment_operator
    : '??='
    ;

Ce qui suit les règles sémantiques existantes pour les opérateurs d’assignation composée (§12.21.4), sauf que nous omettons l’affectation si le côté gauche n’est pas null. Les règles de cette fonctionnalité sont les suivantes.

Étant donné a ??= b, où A est le type de a, B est le type de bet A0 est le type sous-jacent de A si A est un type valeur nullable :

  1. Si A n’existe pas ou s’il s’agit d’un type valeur non nullable, une erreur au moment de la compilation se produit.
  2. Si B n’est pas implicitement convertible en A ou A0 (si A0 existe), une erreur au moment de la compilation se produit.
  3. Si A0 existe et B est implicitement convertible en A0, et B n’est pas dynamique, le type de a ??= b est A0. a ??= b est évaluée au moment de l’exécution comme suit :
    var tmp = a.GetValueOrDefault();
    if (!a.HasValue) { tmp = b; a = tmp; }
    tmp
    
    Sauf que a n’est évalué qu’une seule fois.
  4. Sinon, le type de a ??= b est A. a ??= b est évaluée au moment de l’exécution en tant que a ?? (a = b), sauf que a n’est évaluée qu’une seule fois.

Pour la relaxation des exigences de type de ??, nous mettons à jour la spécification dans laquelle il indique actuellement que, étant donné a ?? b, où A est le type de a:

  1. Si A existe et n’est pas un type nullable ou un type référence, une erreur au moment de la compilation se produit.

Nous assouplissons cette exigence pour :

  1. Si A existe et est un type valeur non nullable, une erreur de compilation se produit.

Cela permet à l’opérateur de fusion Null de fonctionner sur des paramètres de type non contraintes, car le paramètre de type non contrainte T existe, n’est pas un type nullable et n’est pas un type référence.

Inconvénients

Comme pour toute fonctionnalité linguistique, nous devons nous demander si la complexité supplémentaire de la langue est remboursée dans la clarté supplémentaire offerte au corps des programmes C# qui bénéficieraient de la fonctionnalité.

Alternatives

Le programmeur peut écrire (x = x ?? y), if (x == null) x = y;ou x ?? (x = y) manuellement.

Questions non résolues

  • [ ] Faut-il également prendre en charge les opérateurs &&= et ||= ?

Concevoir des réunions

Aucun.