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)
、T
がNULL可能である場合にのみ機能します。それを強制する方法はありません。
したがって、List(n)
モードを実行する必要がありました(これに置き換えられてList.filled(n, value)
、塗りつぶし値を指定する必要があります)。それは残ったList()
、それは実際にはそれ自身の重みを持っていない。[]
代わりに使用することができます(そしてそうすべきです!)ので、コンストラクターを完全に削除することにしました-それのすべての使用は安全でないか役に立たないかのどちらかでした。(また、これはすでに奇妙なコンストラクターでした。適切にnullセーフにしたい場合は、null許容型ではなく、デフォルト値のないオプションのパラメーターがあるためです。)
これを完全に削除することList
で、将来、おそらくの短いエイリアスとして、新しいコンストラクターを導入できるようになりList.filled
ます。希望することができます。