DartのnullセーフティでList()コンストラクタにアクセスできないのはなぜですか?

Aug 17 2020

NNBDでは、デフォルトのコンストラクターを使用してリストを初期化することはできません。

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

ただし、それでも次のことができます。

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

それで、2つの違いは何ですか?両方ともエラーを表示するか、どちらも表示しないはずです。

回答

5 lrn Aug 18 2020 at 03:30

Listコンストラクタは2つの用途を持っていました:

  • new List()と同等の空の拡張可能なリストを作成します[]
  • new List(n)値でn満たされた長さの固定長リストを作成するにはnull

安全性がないため、2回目の使用はほとんどの場合不健全であり、それを修正する良い方法はありませんでした。型引数を強制的にNULL不可にすることは可能ですがList<T>(4)TNULL可能である場合にのみ機能します。それを強制する方法はありません。

したがって、List(n)モードを実行する必要がありました(これに置き換えられてList.filled(n, value)、塗りつぶし値を指定する必要があります)。それは残ったList()、それは実際にはそれ自身の重みを持っていない。[]代わりに使用することができます(そしてそうすべきです!)ので、コンストラクターを完全に削除することにしました-それのすべての使用は安全でないか役に立たないかのどちらかでした。(また、これはすでに奇妙なコンストラクターでした。適切にnullセーフにしたい場合は、null許容型ではなく、デフォルト値のないオプションのパラメーターがあるためです。)

これを完全に削除することListで、将来、おそらくの短いエイリアスとして、新しいコンストラクターを導入できるようになりList.filledます。希望することができます。