Had Inferens Jenis Generik C#: Kes Kekangan Antara Muka
Kaedah generik C# menyediakan pengendalian data yang boleh disesuaikan merentasi pelbagai jenis. Walau bagaimanapun, inferens jenis automatik pengkompil tidak selalu berjaya. Had ini menjadi jelas apabila menangani kekangan antara muka dalam kaedah generik.
Pertimbangkan contoh ini:
<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(); // Compilation Error: Type inference failed p.Process(query); // Explicit type arguments required for successful compilation p.Process<SomeQuery, string>(query); } }</code>
Pengkompil gagal membuat kesimpulan TQuery
dan TResult
dalam panggilan p.Process(query)
pertama. Sebabnya ialah mekanisme inferens jenis C# bergantung pada jenis argumen yang disediakan. Walaupun query
adalah jenis SomeQuery
, ini sahaja tidak mentakrifkan sepenuhnya TQuery
dan TResult
.
Kekangan where TQuery : IQuery<TResult>
membenarkan berbilang pelaksanaan IQuery
, tetapi pengkompil tidak dapat menyimpulkan pelaksanaan yang tepat daripada jenis hujah. Oleh itu, argumen jenis eksplisit (<SomeQuery, string>
) diperlukan untuk menyelesaikan jenis generik.
Seperti yang dijelaskan oleh Eric Lippert (https://www.php.cn/link/4a3cffe005397d4cffdee044f1c8d30e), kekangan adalah bukan sebahagian daripada tandatangan kaedah dan oleh itu tidak digunakan untuk jenis inferens. Inferens adalah berdasarkan semata-mata pada jenis parameter formal, yang, yang penting, mengecualikan kekangan.
Atas ialah kandungan terperinci Mengapa C# Tidak Boleh Menyimpulkan Argumen Jenis Generik dalam Kaedah dengan Kekangan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!