Limitations de l'inférence de type générique C#
Le mécanisme d'inférence de type de C# peut généralement déduire intelligemment les paramètres génériques des méthodes génériques. Cependant, l'inférence de type peut échouer dans certains cas, comme le montre l'exemple suivant :
<code class="language-csharp">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { }</code>
Dans le code ci-dessus, lors de l'appel de la méthode SomeQuery
de IQueryProcessor
à l'aide d'une instance Process
, le compilateur est incapable de déduire les paramètres génériques corrects. Spécifier explicitement les paramètres résout ce problème :
<code class="language-csharp">p.Process<SomeQuery, string>(query);</code>
Raison de l'échec de l'inférence
Contrairement aux hypothèses initiales, les contraintes seules ne suffisent pas pour l'inférence de type. L'inférence de type de C# est entièrement basée sur les paramètres et leurs types de paramètres formels correspondants. Étant donné que le type de paramètre fourni est SomeQuery
(qui implémente IQuery<string>
), le compilateur ne peut pas automatiquement déduire que les paramètres génériques doivent être TQuery = SomeQuery
et TResult = string
.
Eric Lippert dans l'article "Les contraintes ne font pas partie de la signature" (https://www.php.cn/link/4cf06252cc21d496e754ad7185d0617d.
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!