Maison >développement back-end >C++ >Pourquoi C# ne peut-il pas déduire des arguments de type générique dans les méthodes avec des contraintes d'interface ?

Pourquoi C# ne peut-il pas déduire des arguments de type générique dans les méthodes avec des contraintes d'interface ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-23 09:31:09205parcourir

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

Limitations de l'inférence de type générique C# : le cas des contraintes d'interface

Les méthodes génériques de C# permettent une gestion adaptable des données sur divers types. Cependant, l’inférence de type automatique du compilateur ne réussit pas toujours. Cette limitation devient apparente lorsqu'il s'agit de contraintes d'interface dans les méthodes génériques.

Considérez cet exemple :

<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>

Le compilateur ne parvient pas à déduire TQuery et TResult lors du premier p.Process(query) appel. La raison en est que le mécanisme d'inférence de type de C# repose sur les types des arguments fournis. Bien que query soit de type SomeQuery, cela ne définit pas à lui seul TQuery et TResult.

La contrainte where TQuery : IQuery<TResult> permet plusieurs IQuery implémentations, mais le compilateur ne peut pas déduire l'implémentation précise du type d'argument. Par conséquent, des arguments de type explicites (<SomeQuery, string>) sont nécessaires pour résoudre les types génériques.

Comme l'explique Eric Lippert (https://www.php.cn/link/4a3cffe005397d4cffdee044f1c8d30e), les contraintes ne font pas partie de la signature d'une méthode et ne sont donc pas utilisées pour le type inférence. L'inférence est basée uniquement sur les types de paramètres formels, qui, de manière cruciale, excluent les contraintes.

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