Maison >développement back-end >C++ >Pourquoi C# ne peut-il pas déduire des types génériques avec des contraintes d'interface ?

Pourquoi C# ne peut-il pas déduire des types génériques avec des contraintes d'interface ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-23 09:41:08303parcourir

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

Limitations de l'inférence de type générique C#

Pourquoi C# ne peut-il pas déduire le type générique dans ce cas ?

Dans l'utilisation de méthodes génériques, l'inférence de type C# identifiera généralement les paramètres génériques corrects. Cependant, dans certains cas, cela peut échouer, obligeant le programmeur à spécifier explicitement le type. Cet article traite d'une situation dans laquelle un compilateur serait incapable de faire des inférences.

Considérez l'extrait de code suivant :

<code class="language-c#">interface IQuery<TResult> { }

interface IQueryProcessor
{
    TResult Process<TQuery, TResult>(TQuery query)
        where TQuery : IQuery<TResult>;
}

class SomeQuery : IQuery<string>
{
}</code>

Dans une méthode Test, lors de l'appel de SomeQuery avec une instance Process comme argument, le compilateur ne peut pas déduire l'argument générique :

<code class="language-c#">class Test
{
    void Test(IQueryProcessor p)
    {
        var query = new SomeQuery();

        // 无法编译 :-(
        p.Process(query);

        // 必须显式编写所有参数
        p.Process<SomeQuery, string>(query);
    }
}</code>

La question est : pourquoi le compilateur ne réussit-il pas à déduire les paramètres génériques dans ce cas ?

Contraintes et inférences

La réponse réside dans la façon dont C# gère les contraintes de paramètres génériques. Les contraintes (telles que TQuery : IQuery<TResult>) limitent les types pouvant être utilisés comme arguments. Cependant, les contraintes ne sont pas considérées comme faisant partie de la signature de la méthode et ne peuvent donc pas être utilisées pour l'inférence de type.

Dans ce cas particulier, le compilateur peut déterminer que le paramètre query implémente IQuery<TResult>, mais il ne peut pas utiliser les contraintes pour déduire le type concret de TResult. Par conséquent, cela nécessite des paramètres de type explicites.

Conclusion

Lors de l'utilisation de génériques, il est crucial de comprendre les limites de l'inférence de type C#. Bien que le compilateur fasse généralement un assez bon travail en matière d'inférence de types, dans certains cas, des contraintes l'empêchent de le faire. Dans ce cas, des paramètres génériques spécifiques doivent être fournis pour guider le compilateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn