Почему конструктор List () недоступен в нулевой безопасности Dart?

Aug 17 2020

С NNBD вам не разрешено инициализировать список с помощью конструктора по умолчанию:

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

Однако вы все равно можете:

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

Итак, в чем разница между ними? Либо оба из них должны показывать ошибку, либо ни одна из них.

Ответы

5 lrn Aug 18 2020 at 03:30

ListКонструктор имел два применения:

  • new List()для создания пустого расширяемого списка, эквивалентного [].
  • new List(n)для создания списка фиксированной длины, nзаполненного nullзначениями

При нулевой безопасности второе использование в большинстве случаев было ненадежным, и не было хорошего способа исправить это. Можно заставить аргумент типа быть ненулевыми, но List<T>(4)работает только тогда , когда Tэто обнуляемое . Невозможно добиться этого.

Итак, List(n)режим, который нужно было запустить (заменен на List.filled(n, value)который заставляет вас указать значение заполнения). Это левое List(), что на самом деле не имеет собственного веса. []Вместо этого вы можете просто использовать (и должны !), Поэтому было решено полностью удалить конструктор - все его использования были либо небезопасными, либо бесполезными. (Кроме того, это уже был странный конструктор, потому что, если бы мы хотели правильно сделать его нулевым безопасным, у него был бы необязательный параметр с типом, не допускающим значения NULL, и без значения по умолчанию.)

Полностью удалив его, можно потенциально ввести новый Listконструктор в будущем, возможно, в качестве более короткого псевдонима для List.filled. Можно надеяться.