Rumah >pembangunan bahagian belakang >C++ >Mengapa Inferens Jenis Generik C# Gagal dengan Kekangan Antara Muka?

Mengapa Inferens Jenis Generik C# Gagal dengan Kekangan Antara Muka?

DDD
DDDasal
2025-01-23 09:46:10980semak imbas

Why Does C# Generic Type Inference Fail with Interface Constraints?

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!

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