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

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

Susan Sarandon
Lepaskan: 2025-01-23 09:26:10
asal
397 orang telah melayarinya

Why Can't C# Infer Generic Types in Methods with Constraints?

Inferens Jenis Generik C#: Memahami Hadnya

Apabila menggunakan kaedah generik C#, selalunya diandaikan bahawa pengkompil boleh membuat kesimpulan parameter generik berdasarkan kekangan. Walau bagaimanapun, terdapat situasi di mana inferens ini kelihatan sukar dicapai.

Pertimbangkan kod berikut:

<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();

        // 编译失败
        p.Process(query);

        // 需要显式指定泛型参数
        p.Process<SomeQuery, string>(query);
    }
}</code>
Salin selepas log masuk

Kod ini gagal untuk disusun kerana parameter generik tidak boleh disimpulkan. Persoalannya ialah: mengapa pengkompil tidak boleh menyimpulkan jenis yang betul?

Menurut bekas ketua jurutera Microsoft C# Eric Lippert, sebabnya terletak pada cara C# melakukan inferens jenis. Inferens dilakukan hanya dengan memeriksa parameter dan jenis parameter formal yang sepadan. Dalam kes ini, pengkompil tidak mempunyai maklumat yang mencukupi untuk membuat kesimpulan parameter generik.

kekangan, seperti yang ditakrifkan oleh where TQuery : IQuery<TResult>, tidak dianggap sebagai sebahagian daripada tandatangan dan oleh itu tidak boleh digunakan secara langsung untuk inferens.

Untuk menyelesaikan masalah ini, parameter generik mesti dinyatakan secara eksplisit, seperti yang ditunjukkan dalam panggilan kaedah Process kedua. Ini selaras dengan falsafah reka bentuk C# bahawa kekangan memberikan maklumat tambahan tetapi tidak mengubah tandatangan kaedah.

Dalam versi C# terkini, peraturan untuk menggunakan kekangan telah diubah suai sedikit. Untuk maklumat yang paling tepat, adalah disyorkan untuk merujuk dokumentasi C# rasmi atau menyemak pelaksanaan sebenar C# 7.3 dan ke atas.

Atas ialah kandungan terperinci Mengapa C# Tidak Boleh Menyimpulkan Jenis Generik dalam Kaedah dengan Kekangan?. 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