Dart의 null 안전에서 List () 생성자에 액세스 할 수없는 이유는 무엇입니까?

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

null 안전을 사용하면 두 번째 사용은 대부분 부적절했으며이를 고칠 좋은 방법이 없었습니다. 형식 인수를 nullable이 아니도록 강제 할 수 있지만 이 nullable 인List<T>(4) 경우에만 작동합니다 . 그것을 강제 할 방법이 없습니다.T

따라서 List(n)이동해야하는 모드 ( List.filled(n, value)채우기 값을 제공하도록 대체 됨) 가 필요했습니다 . 그것은 List()실제로 자체 무게를 지니지 않는 왼쪽 입니다. []대신 사용할 수 있습니다 ( 해야합니다 !). 그래서 생성자를 완전히 제거하기로 결정했습니다. 모든 사용은 안전하지 않거나 쓸모가 없었습니다. (또한, 이미 이상한 생성자였습니다. 왜냐하면 우리가 적절하게 null로 안전하게 만들고 싶다면 nullable이 아닌 타입을 가진 선택적 매개 변수를 가질 것이고 기본값은 없을 것이기 때문입니다.)

완전히 제거하면 잠재적 List으로 .NET Framework의 더 짧은 별칭으로 향후 새 생성자를 도입 할 수 있습니다 List.filled. 희망 할 수 있습니다.