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