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中文網其他相關文章!