Почему конструктор List () недоступен в нулевой безопасности Dart?
С NNBD вам не разрешено инициализировать список с помощью конструктора по умолчанию:
List<int> foo = List(); // Compile time error
Однако вы все равно можете:
List<int> foo = []; // No error
Итак, в чем разница между ними? Либо оба из них должны показывать ошибку, либо ни одна из них.
Ответы
List
Конструктор имел два применения:
new List()
для создания пустого расширяемого списка, эквивалентного[]
.new List(n)
для создания списка фиксированной длины,n
заполненногоnull
значениями
При нулевой безопасности второе использование в большинстве случаев было ненадежным, и не было хорошего способа исправить это. Можно заставить аргумент типа быть ненулевыми, но List<T>(4)
работает только тогда , когда T
это обнуляемое . Невозможно добиться этого.
Итак, List(n)
режим, который нужно было запустить (заменен на List.filled(n, value)
который заставляет вас указать значение заполнения). Это левое List()
, что на самом деле не имеет собственного веса. []
Вместо этого вы можете просто использовать (и должны !), Поэтому было решено полностью удалить конструктор - все его использования были либо небезопасными, либо бесполезными. (Кроме того, это уже был странный конструктор, потому что, если бы мы хотели правильно сделать его нулевым безопасным, у него был бы необязательный параметр с типом, не допускающим значения NULL, и без значения по умолчанию.)
Полностью удалив его, можно потенциально ввести новый List
конструктор в будущем, возможно, в качестве более короткого псевдонима для List.filled
. Можно надеяться.