ฉันกลับไปตอบคำถาม "ทำไมไม่" เพราะอย่างแรกคำตอบแทบจะไม่น่าพอใจเลย - คุณได้รับคำตอบแล้ว "ฟีเจอร์ไม่ได้เป็นอย่างที่คุณต้องการเพราะข้อกำหนดไม่ได้บอกว่าคุณต้องการให้พูดอะไร" ซึ่งฉันคิดว่าไม่ใช่คำตอบที่น่าพอใจเป็นพิเศษ ประการที่สองทีมออกแบบไม่จำเป็นต้องให้เหตุผลว่าทำไมโลกถึงไม่เป็นอย่างที่คุณต้องการ ไม่มีคุณลักษณะฟรีและได้รับการออกแบบจากภาษา คุณลักษณะต่างๆจะต้องได้รับการพิสูจน์ก่อนแล้วจึงออกแบบมา
ดังนั้นเรามาลองทำให้คำถาม "ทำไมไม่" ของคุณชัดเจนขึ้นอีกนิด คุณลักษณะที่มีอยู่คือ "อาจใช้ตัวเริ่มต้นอาร์เรย์ (a) ทางด้านขวาของค่าเท่ากับในการเริ่มต้นหรือ (b) ทางด้านขวาของการสร้างวัตถุประเภทอาร์เรย์" คุณลักษณะที่เสนอคือ: "ตัวเริ่มต้นอาร์เรย์อาจใช้เป็นนิพจน์ได้" คำถามคือ "เอริคจะวิพากษ์วิจารณ์อะไรเกี่ยวกับคุณลักษณะที่นำเสนอ"
คำวิจารณ์แรกที่ฉันจะทำคือมันไม่ชัดเจนว่าประเภทของการแสดงออกคืออะไร ในตัวแปรเริ่มต้นคุณมีประเภทของตัวแปรและในนิพจน์การสร้างอ็อบเจ็กต์คุณมีประเภทของอ็อบเจ็กต์ จากทั้งสองอย่างนี้เราสามารถอนุมานประเภทของอาร์เรย์ที่สร้างขึ้น เราควรอนุมานประเภทใดโดยไม่มีคำใบ้
ใน C # 1.0 เมื่อมีการเพิ่มคุณสมบัตินี้มีการอนุมานประเภทศูนย์ทั้งหมดที่เกิดขึ้นในภาษา หลักการออกแบบในยุคแรก ๆ ของ C # คือ "ไม่น่าประหลาดใจ" และคอมไพเลอร์ก็ไม่ "ฉลาดเกินไป" หากผู้พัฒนาตั้งใจให้นิพจน์เป็นประเภทใดประเภทหนึ่งประเภทนั้นควรจะชัดเจนในนิพจน์ เมื่อคุณพูดว่า
new double[] { 1, 2, 3.4 }
ค่อนข้างชัดเจนว่ามีจุดประสงค์ใด ในทำนองเดียวกัน
new Animal[] { cat, dog, null }
คุณลักษณะที่นำเสนอละเมิดหลักการนี้ นิพจน์ต้องมีประเภท แต่ไม่ชัดเจนว่าอาร์กิวเมนต์อยู่ในประเภทใด
M({cat, dog, null})
นอกจากนี้: สมมติว่าเรามีสองทับถมของMหนึ่งซึ่งใช้เวลาอาร์เรย์ของและหนึ่งซึ่งใช้เวลาอาร์เรย์ของAnimal IPetใช้งานเกินพิกัดMใด หนึ่งใน Conversion ดีกว่าอีกรายการหรือไม่? ประเภทขององค์ประกอบคือCatและDog; มันสมเหตุสมผลหรือไม่ที่จะอนุมานประเภทที่ไม่ได้ปรากฏที่นั่น? คำถามเหล่านี้ล้วนเป็นคำถามที่ทีมออกแบบต้องพิจารณาและเป็นคำถามที่ไม่มีคำตอบที่ชัดเจน คุณลักษณะที่เสนอนำเราไปสู่ห้วงน้ำลึกในระยะสั้น ๆ
ตอนนี้ C # 3.0 แก้ปัญหานี้ได้เนื่องจาก C # 3.0 ได้เพิ่มคุณสมบัติมากมายที่คอมไพเลอร์สรุปประเภทในนามของผู้พัฒนา หลักการก่อนหน้านี้เกี่ยวกับ "ไม่เซอร์ไพรส์" และ "กฎง่ายๆ" ขัดแย้งกับหลักการออกแบบอื่น ๆ ที่จำเป็นในการทำให้ LINQ ทำงานได้ ควรเพิ่มคุณลักษณะที่คุณเสนอใน C # 3.0 หรือไม่?
มันอาจจะเป็น คุณลักษณะที่เพิ่มเข้ามาใน C # 3.0 คือ:
new[] { x, y, z }
อนุมานประเภทของอาร์เรย์โดยใช้อัลกอริทึม: ใช้นิพจน์สำหรับองค์ประกอบที่มีประเภทกำหนดว่าประเภทใดเป็นประเภททั่วไปที่ไม่ซ้ำกันซึ่งนิพจน์อื่น ๆ ทั้งหมดสามารถเปลี่ยนแปลงได้และหากมีประเภทดังกล่าวอยู่ให้เลือกประเภทนั้น มิฉะนั้นจะเกิดข้อผิดพลาด
คุณลักษณะนั้นอาจผ่อนคลายมากขึ้นเพื่อให้เป็นnew[]ทางเลือก สิ่งนี้ไม่ได้ทำ
ตอนนี้ถ้าคุณถามฉันในกรอบเวลา C # 3.0 เพื่อวิจารณ์คุณลักษณะที่นำเสนอฉันจะชี้ให้เห็นว่า (1) คอมไพเลอร์ C # 3.0 ตกอยู่ในอันตรายร้ายแรงจากการเลื่อนกำหนดการสำหรับการเปิดตัวทั้งหมดดังนั้นอย่าเพิ่มอีกต่อไป ภาระการออกแบบการใช้งานและการทดสอบสำหรับคุณลักษณะที่ไม่จำเป็นอย่างละเอียดซึ่งช่วยให้ผู้ใช้ประหยัดการกดแป้นพิมพ์ได้หกครั้งและ (2) C # 3.0 ยังเพิ่มตัวเริ่มต้นการรวบรวม:
new List<int>() { 10, 20, 30 }
เหตุผลที่ควร{10, 20, 30}จะเป็นโดยอัตโนมัติอาร์เรย์ ? ทำไมไม่ควรเป็นList<int>? หรือประเภทอื่น ๆ ทำไมถึงมีอคติต่ออาร์เรย์ โปรดจำไว้ว่าเมื่อเราเลือกที่จะประดิษฐานไวยากรณ์สำหรับอาร์เรย์เราจะติดอยู่กับมันตลอดไป อาจไม่เป็นอย่างอื่นดังนั้นคุณลักษณะที่นำเสนอจึงไม่เพียง แต่ไม่จำเป็นเท่านั้น แต่ยังป้องกันคุณลักษณะในอนาคตที่ดูเป็นไปได้อีกด้วย
สรุป: คุณลักษณะที่นำเสนอนั้นละเมิดหลักการออกแบบบางประการของ C # 1.0 โดยตรง เป็นการเพิ่มภาระให้กับ C # 3.0 โดยไม่จำเป็น ในทุกเวอร์ชันของภาษาตั้งแต่ C # 3.0 คุณลักษณะที่นำเสนอนี้ไม่มีข้อโต้แย้งที่ดีที่จะแนะนำให้ใช้เวลาความพยายามและเงินกับคุณลักษณะที่คุ้มค่าอื่น ๆ อีกมากมาย
ดังนั้นจึงไม่มีคุณสมบัติดังกล่าว