Rumah >pembangunan bahagian belakang >C++ >Mengapa Inferens Jenis Generik C# Gagal dengan Kekangan Antara Muka?
Batasan inferens jenis generik C#
Mekanisme inferens jenis C# biasanya boleh membuat kesimpulan secara bijak parameter generik kaedah generik. Walau bagaimanapun, inferens jenis mungkin gagal dalam beberapa kes, seperti yang ditunjukkan dalam contoh berikut:
<code class="language-csharp">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { }</code>
Dalam kod di atas, apabila memanggil kaedah SomeQuery
IQueryProcessor
menggunakan contoh Process
, pengkompil tidak dapat membuat kesimpulan parameter generik yang betul. Menentukan parameter secara eksplisit menyelesaikan masalah ini:
<code class="language-csharp">p.Process<SomeQuery, string>(query);</code>
Sebab kegagalan inferens
Bertentangan dengan andaian awal, kekangan sahaja tidak mencukupi untuk jenis inferens. Inferens jenis C# sepenuhnya berdasarkan parameter dan jenis parameter formal yang sepadan. Memandangkan jenis parameter yang disediakan ialah SomeQuery
(yang melaksanakan IQuery<string>
), pengkompil tidak boleh membuat kesimpulan secara automatik bahawa parameter generik hendaklah TQuery = SomeQuery
dan TResult = string
.
Eric Lippert dalam artikel "Kekangan bukan sebahagian daripada tandatangan" (https://www.php.cn/link/4cf06252cc21d496e754ad7185d0617d.
Atas ialah kandungan terperinci Mengapa Inferens Jenis Generik C# Gagal dengan Kekangan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!