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
Libérer: 2025-01-23 09:31:09
original
209 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal