Rumah >pembangunan bahagian belakang >C++ >Mengapa Pembina C# Tidak Boleh Mewarisi Inferens Jenis daripada Kaedah Generik?

Mengapa Pembina C# Tidak Boleh Mewarisi Inferens Jenis daripada Kaedah Generik?

DDD
DDDasal
2025-01-20 06:37:13605semak imbas

Why Can't C# Constructors Inherit Type Inference from Generic Methods?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn