Rumah > pembangunan bahagian belakang > C++ > Mengapa C# Tidak Boleh Menyimpulkan Argumen Jenis Generik dalam Kaedah dengan Kekangan Antara Muka?

Mengapa C# Tidak Boleh Menyimpulkan Argumen Jenis Generik dalam Kaedah dengan Kekangan Antara Muka?

Patricia Arquette
Lepaskan: 2025-01-23 09:31:09
asal
209 orang telah melayarinya

Why Can't C# Infer Generic Type Arguments in Methods with Interface Constraints?

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan