Pourquoi le constructeur List() n'est-il pas accessible dans la sécurité nulle de Dart ?

Aug 17 2020

Avec NNBD, vous n'êtes pas autorisé à initialiser la liste en utilisant le constructeur par défaut :

List<int> foo = List(); // Compile time error

Cependant, vous pouvez toujours faire :

List<int> foo = []; // No error

Alors, quelle est la différence entre les deux ? Soit les deux doivent afficher l'erreur, soit aucun d'eux.

Réponses

5 lrn Aug 18 2020 at 03:30

Le Listconstructeur avait deux utilisations :

  • new List()pour créer une liste extensible vide, équivalente à [].
  • new List(n)pour créer une liste de longueur fixe de longueur nremplie de nullvaleurs

Avec une sécurité nulle, la deuxième utilisation était la plupart du temps malsaine, et il n'y avait pas de bon moyen de le réparer. Il est possible de forcer un argument de type à être non nullable, mais List<T>(4)ne fonctionne que lorsque Test nullable . Il n'y a aucun moyen de faire respecter cela.

Donc, le List(n)mode nécessaire pour aller (remplacé par List.filled(n, value)ce qui vous oblige à fournir une valeur de remplissage). C'est parti List(), qui ne porte pas vraiment son propre poids. Vous pouvez simplement utiliser à la []place (et vous devriez !), il a donc été décidé de supprimer entièrement le constructeur - toutes ses utilisations étaient soit dangereuses, soit inutiles. (De plus, c'était déjà un constructeur étrange, car si nous voulions le rendre correctement sûr, il aurait un paramètre facultatif avec un type non nullable et aucune valeur par défaut.)

En le supprimant complètement, cela permet d'introduire potentiellement un nouveau Listconstructeur à l'avenir, peut-être comme un alias plus court pour List.filled. On peut espérer.