Inferens Jenis Generik C#: Memahami Hadnya
Apabila menggunakan kaedah generik C#, selalunya diandaikan bahawa pengkompil boleh membuat kesimpulan parameter generik berdasarkan kekangan. Walau bagaimanapun, terdapat situasi di mana inferens ini kelihatan sukar dicapai.
Pertimbangkan kod berikut:
<code class="language-csharp">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { } class Test { void Test(IQueryProcessor p) { var query = new SomeQuery(); // 编译失败 p.Process(query); // 需要显式指定泛型参数 p.Process<SomeQuery, string>(query); } }</code>
Kod ini gagal untuk disusun kerana parameter generik tidak boleh disimpulkan. Persoalannya ialah: mengapa pengkompil tidak boleh menyimpulkan jenis yang betul?
Menurut bekas ketua jurutera Microsoft C# Eric Lippert, sebabnya terletak pada cara C# melakukan inferens jenis. Inferens dilakukan hanya dengan memeriksa parameter dan jenis parameter formal yang sepadan. Dalam kes ini, pengkompil tidak mempunyai maklumat yang mencukupi untuk membuat kesimpulan parameter generik.
kekangan, seperti yang ditakrifkan oleh where TQuery : IQuery<TResult>
, tidak dianggap sebagai sebahagian daripada tandatangan dan oleh itu tidak boleh digunakan secara langsung untuk inferens.
Untuk menyelesaikan masalah ini, parameter generik mesti dinyatakan secara eksplisit, seperti yang ditunjukkan dalam panggilan kaedah Process
kedua. Ini selaras dengan falsafah reka bentuk C# bahawa kekangan memberikan maklumat tambahan tetapi tidak mengubah tandatangan kaedah.
Dalam versi C# terkini, peraturan untuk menggunakan kekangan telah diubah suai sedikit. Untuk maklumat yang paling tepat, adalah disyorkan untuk merujuk dokumentasi C# rasmi atau menyemak pelaksanaan sebenar C# 7.3 dan ke atas.
Atas ialah kandungan terperinci Mengapa C# Tidak Boleh Menyimpulkan Jenis Generik dalam Kaedah dengan Kekangan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!