เหตุใดตัวสร้าง 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()การสร้างรายการ growable []ว่างเทียบเท่า
  • new List(n)เพื่อสร้างรายการความยาวคงที่ที่nเต็มไปด้วยnullค่า

ด้วยความปลอดภัยที่เป็นโมฆะการใช้งานครั้งที่สองไม่เป็นผลโดยส่วนใหญ่และไม่มีวิธีที่ดีในการแก้ไข เป็นไปได้ที่จะบังคับให้อาร์กิวเมนต์ประเภทไม่เป็นโมฆะ แต่List<T>(4)จะใช้ได้เฉพาะเมื่อTเป็นโมฆะเท่านั้น ไม่มีทางบังคับได้อย่างนั้น

ดังนั้นList(n)โหมดที่จำเป็นในการดำเนินการ (แทนที่ด้วยการList.filled(n, value)บังคับให้คุณระบุค่าการเติม) ด้านซ้ายList()ซึ่งไม่ได้รับน้ำหนักของตัวเองจริงๆ คุณสามารถใช้[]แทนได้ (และคุณควร !) ดังนั้นจึงมีการตัดสินใจที่จะลบตัวสร้างทั้งหมด - การใช้งานทั้งหมดไม่ปลอดภัยหรือไร้ประโยชน์ (นอกจากนี้มันเป็นตัวสร้างที่แปลกอยู่แล้วเพราะถ้าเราต้องการทำให้มันเป็นโมฆะอย่างถูกต้องมันจะมีพารามิเตอร์ที่เป็นทางเลือกที่มีประเภทที่ไม่เป็นโมฆะและไม่มีค่าเริ่มต้น)

โดยการเอามันสมบูรณ์ก็จะทำให้มันเป็นไปได้ที่อาจแนะนำใหม่คอนสตรัคในอนาคตอาจจะเป็นนามแฝงที่สั้นลงList List.filledหนึ่งสามารถหวัง