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
Lepaskan: 2025-01-23 09:46:10
asal
988 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan