Dalam C # generics, kita dapat mendeklarasikan batasan untuk tipe parameter T
untuk memiliki konstruktor default, dengan mengatakan where T : new()
. Namun, tidak ada kendala lain seperti ini yang valid - new(string)
misalnya, dll.
Dari desain bahasa dan / atau perspektif implementasi, apa alasannya?
Apakah ada sesuatu dalam cara konstruktor bekerja atau dalam cara sistem tipe diimplementasikan yang melarang ini (atau setidaknya membuatnya lebih sulit)? Jika demikian, apakah itu? Saya ingat pernah membaca di suatu tempat yang default(T)
sebenarnya cocok new T()
untuk T : struct
. Apakah ini terkait dengan ini, mungkin?
Atau itu hanya keputusan desain yang dibuat untuk menghindari membuat bahasa terlalu rumit?
c#
language-design
generics
Theodoros Chatzigiannakis
sumber
sumber
new(string)
bukan kendala konstruktor default. Pertanyaan Anda sama saja dengan mengatakan "Mengapa tidak ada kendala yang memerlukan tanda tangan konstruktor tertentu?" Sangat mungkin karena kendala seperti itu tidak akan terlalu berguna.Jawaban:
Untuk jawaban yang berwibawa, saya akan merujuk Anda ke jawaban Eric Lippert untuk pertanyaan itu di StackOverflow beberapa tahun yang lalu, sebuah cuplikan yang dikutip secara singkat di bawah ini.
sumber
Penguraian (sesuai saran Robert Harvey) menghasilkan yang berikut, untuk siapa pun yang tertarik. Metode ini:
Rupanya, ketika dikompilasi, menjadi ini:
T
merupakan tipe nilai,new()
jadilahdefault(T)
.T
merupakan tipe referensi,new()
bekerja menggunakan refleksi.Activator.CreateInstance()
panggilan internalRuntimeType.CreateInstanceDefaultCtor()
.Jadi begitulah - secara internal, konstruktor default benar-benar khusus untuk C # dalam kaitannya dengan CLR. Memberikan konstruktor lain perlakuan yang sama akan mahal, bahkan jika ada beberapa kasus penggunaan yang valid untuk kendala yang lebih rumit dalam obat generik.
sumber
default(T)
untuk tipe nilai?t
variabel (yang bisa diganti denganreturn
pernyataan bersarang ).