Pourquoi le constructeur List() n'est-il pas accessible dans la sécurité nulle de Dart ?
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
Le List
constructeur 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 longueurn
remplie denull
valeurs
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 T
est 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 List
constructeur à l'avenir, peut-être comme un alias plus court pour List.filled
. On peut espérer.