Saya menolak pertanyaan "mengapa tidak" karena pertama, jawabannya hampir tidak pernah memuaskan - Anda sudah mendapatkan jawaban "fiturnya tidak sesuai dengan yang Anda inginkan karena spesifikasinya tidak menyatakan apa yang Anda inginkan" , yang menurut saya bukanlah jawaban yang memuaskan. Kedua, tim desain tidak harus membenarkan mengapa dunia tidak seperti yang Anda inginkan; fitur tidak ada secara gratis dan kemudian dirancang dari bahasa tersebut; sebaliknya, fitur harus dijustifikasi terlebih dahulu, dan kemudian didesain.
Jadi, mari kita coba membuat pertanyaan "mengapa tidak" Anda sedikit lebih tajam. Fitur yang ada adalah "penginisialisasi array dapat digunakan (a) di sisi kanan yang sama dalam inisialisasi atau (b) di sebelah kanan konstruksi objek tipe array." Fitur yang diusulkan adalah: "penginisialisasi larik juga dapat digunakan sebagai ekspresi". Pertanyaannya adalah "kritik apa yang akan Eric buat tentang fitur yang diusulkan?"
Kritik pertama yang akan saya buat adalah tidak jelasnya jenis ekspresi tersebut. Dalam penginisialisasi variabel Anda memiliki tipe variabel dan dalam ekspresi pembuatan objek Anda memiliki tipe objek; dari keduanya, kita dapat menyimpulkan jenis array yang dibangun. Tanpa petunjuk apa pun, jenis apa yang harus kita simpulkan?
Di C # 1.0, ketika fitur ini ditambahkan, ada total inferensi tipe nol yang dibuat dalam bahasa tersebut. Prinsip desain pada masa awal C # adalah "tidak ada kejutan", dan kompilernya tidak "terlalu pintar". Jika pengembang bermaksud ekspresi menjadi tipe tertentu maka tipe itu harus dalam beberapa cara jelas dalam ekspresi. Saat Anda berkata
new double[] { 1, 2, 3.4 }
cukup jelas jenis apa yang dimaksudkan. Demikian pula
new Animal[] { cat, dog, null }
Fitur yang diusulkan melanggar prinsip ini. Ekspresi harus memiliki tipe, tetapi sama sekali tidak jelas apa tipe argumennya
M({cat, dog, null})
Selain itu: Misalkan kita memiliki dua kelebihan M, salah satunya mengambil array Animaldan satu lagi mengambil array IPet. Beban berlebih mana Myang berlaku? Apakah salah satu konversi lebih baik dari yang lain? Jenis elemennya adalah Catdan Dog; apakah masuk akal untuk menyimpulkan jenis yang bahkan tidak muncul di sana? Ini semua adalah pertanyaan yang harus dipertimbangkan oleh tim desain, dan ini adalah pertanyaan yang tidak memiliki jawaban yang jelas. Fitur yang diusulkan membawa kita ke perairan dalam dalam waktu yang cukup singkat.
Sekarang, C # 3.0 memecahkan masalah ini karena C # 3.0 menambahkan banyak fitur di mana kompilator menyimpulkan jenis atas nama pengembang. Prinsip sebelumnya tentang "tidak ada kejutan" dan "aturan sederhana" bertentangan dengan prinsip desain lain yang diperlukan untuk membuat LINQ berfungsi. Haruskah fitur yang Anda usulkan telah ditambahkan di C # 3.0?
Bisa saja. Fitur yang sebenarnya ditambahkan di C # 3.0 adalah:
new[] { x, y, z }
menyimpulkan tipe array menggunakan algoritme: ambil ekspresi untuk elemen yang memiliki tipe, tentukan tipe mana yang merupakan tipe paling umum unik yang semua ekspresi lainnya dapat diubah, dan jika tipe seperti itu ada, pilih itu. Jika tidak menghasilkan kesalahan,
Fitur itu bisa lebih santai untuk dijadikan new[]opsional. Ini belum selesai.
Sekarang, jika Anda telah meminta saya dalam jangka waktu C # 3.0 untuk mengkritik fitur yang diusulkan, saya akan menunjukkan bahwa (1) compiler C # 3.0 sudah berada dalam bahaya besar untuk menyelipkan jadwal untuk seluruh rilis, jadi jangan menambahkan lagi desain, implementasi, dan beban pengujian untuk fitur yang benar-benar tidak perlu yang menghemat enam kali penekanan tombol, dan (2) C # 3.0 juga menambahkan penginisialisasi koleksi:
new List<int>() { 10, 20, 30 }
kenapa harus {10, 20, 30}otomatis jadi array ? Mengapa tidak menjadi List<int>? Atau salah satu dari sejumlah tipe lainnya? Mengapa bias terhadap array? Ingat, begitu kita memilih untuk mengabadikan sintaks untuk array, kita terjebak dengannya selamanya . Ini mungkin tidak akan pernah apa pun, sehingga fitur yang diusulkan tidak hanya tidak perlu, juga mencegah kemungkinan fitur masa depan yang tampaknya masuk akal.
Kesimpulannya: fitur yang diusulkan secara langsung melanggar beberapa prinsip desain C # 1.0. Ia menambahkan apa-apa selain beban yang tidak perlu ke C # 3.0. Di semua versi bahasa sejak C # 3.0, fitur yang diusulkan tidak memiliki argumen yang baik untuk merekomendasikan menghabiskan waktu, tenaga dan uang untuk itu daripada banyak fitur lain yang lebih layak.
Oleh karena itu, tidak ada fitur seperti itu.