C#泛型类型推断的局限性
C#的类型推断机制通常能够智能地推断出泛型方法的泛型参数。然而,某些情况下,类型推断可能会失败,如下例所示:
<code class="language-csharp">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { }</code>
在上面的代码中,当使用SomeQuery
实例调用IQueryProcessor
的Process
方法时,编译器无法推断出正确的泛型参数。显式指定参数可以解决这个问题:
<code class="language-csharp">p.Process<SomeQuery, string>(query);</code>
推断失败的原因
与最初的设想相反,仅靠约束不足以进行类型推断。C#的类型推断完全基于参数及其对应的形式参数类型。由于提供的参数类型是SomeQuery
(它实现了IQuery<string>
),编译器无法自动推断出泛型参数应为TQuery = SomeQuery
和TResult = string
。
Eric Lippert在文章“约束不是签名的一部分”(https://www.php.cn/link/4cf06252cc21d496e754ad7185d0617d。
以上是为什么 C# 泛型类型推断因接口约束而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!