Partage 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é. Elle inclut les changements de spécification proposés, ainsi que les informations nécessaires à la conception et au développement de la fonctionnalité. Ces articles sont publiés jusqu'à ce que les changements proposés soient finalisés et incorporés dans la spécification ECMA actuelle.

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

Pour en savoir plus sur le processus d'adoption des speclets de fonctionnalité dans la norme du langage C#, consultez l'article sur les spécifications.

Problème de champion : https://github.com/dotnet/csharplang/issues/34

Récapitulatif

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 surchargeable au langage qui exécute cette fonction.

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

Conception détaillée

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

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 b et 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 se produira au moment de la compilation.
  2. Si B n’est pas implicitement convertible en A ou A0 (si A0 existe), une erreur se produira au moment de la compilation.
  3. Si A0 existe et B est implicitement convertible en A0 et si B n’est pas dynamique, le type de a ??= b est A0. a ??= b est évalué au moment de l’exécution comme suit :
    var tmp = a.GetValueOrDefault();
    if (!a.HasValue) { tmp = b; a = tmp; }
    tmp
    
    Sauf que a est évalué une seule fois.
  4. Autrement, le type du a ??= b est A. a ??= b est évalué au moment de l’exécution en tant que a ?? (a = b), sauf que a n’est évalué qu’une seule fois.

À des fins d’assouplissement des exigences de type de ??, nous mettons à jour la spécification dans laquelle il est actuellement indiqué que, étant donné a ?? b, où A est le type de a :

  1. Si A existe et n’est pas un type pouvant être Null ou un type référence, une erreur de compilation survient.

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 ||= ?

Réunions de conception

Aucun.