Rumah >pembangunan bahagian belakang >C++ >Mengapa Pembina C# Tidak Boleh Mewarisi Inferens Jenis daripada Kaedah Generik?
Mengapa pembina C# tidak boleh mewarisi jenis inferens daripada kaedah generik?
Dalam C#, pembina tidak mempunyai keupayaan inferens jenis kaedah generik. Contohnya, dalam kod berikut:
<code class="language-csharp">public class MyType<T> { private readonly T field; public MyType(T value) { field = value; } } var obj = new MyType(42); // 期望类型:MyType<int></code>
Pengkompil tidak boleh membuat kesimpulan bahawa obj
adalah jenis MyType<int>
. Satu penyelesaian ialah menggunakan kelas kilang:
<code class="language-csharp">public class MyTypeFactory { public static MyType<T> Create<T>(T value) { return new MyType<T>(value); } } var myObj = MyTypeFactory.Create(42);</code>
Ini menimbulkan persoalan tentang sebab di sebalik sekatan ini.
Adakah puncanya?
Tiada sebab asas yang muktamad yang menghalang pembina daripada melakukan inferens jenis. Sebaliknya, mengenal pasti semua jenis yang berkaitan dan menyelesaikan beban berlebihan antara pembina dengan bilangan parameter yang berbeza memerlukan algoritma yang kompleks. Selain itu, untuk memastikan keserasian ke belakang, pembina bukan generik diutamakan daripada pembina yang disimpulkan.
Halangan Praktikal: Menimbang Kebaikan dan Keburukan
Walaupun jenis inferens dalam pembina mempunyai faedah bersih, ini tidak semestinya menjamin pelaksanaannya. Daya maju sesuatu ciri bergantung pada nilai relatifnya berbanding dengan potensi peningkatan lain, peruntukan sumber dan isu keserasian.
Corak Kilang: Alternatif Bijak
Corak kaedah kilang menyediakan penyelesaian yang berkesan kepada kekurangan inferens jenis pembina. Dengan memperkenalkan lapisan tambahan abstraksi, inferens jenis boleh digunakan pada kaedah kilang untuk mencapai hasil yang serupa tanpa mengubah suai pembina itu sendiri.
Perubahan yang tidak pernah dilaksanakan
Walaupun pelaksanaan telah dipertimbangkan untuk C# 6, ciri yang dicadangkan ini akhirnya dialih keluar daripada reka bentuk akhir. Hakikat bahawa ia hampir diterima pakai menyerlahkan potensi utilitinya, tetapi akhirnya, keutamaan lain diutamakan.
Atas ialah kandungan terperinci Mengapa Pembina C# Tidak Boleh Mewarisi Inferens Jenis daripada Kaedah Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!