C#泛型類型推論的限制
在泛型方法的使用中,C#類型推論通常會辨識出正確的泛型參數。但是,在某些情況下,它可能會失敗,導致程式設計師必須明確指定類型。本文討論了一種編譯器據稱在進行推斷時存在不足的情況。
考慮以下程式碼片段:
<code class="language-c#">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { }</code>
在Test
方法中,當使用SomeQuery
實例作為參數呼叫Process
時,編譯器無法推斷泛型參數:
<code class="language-c#">class Test { void Test(IQueryProcessor p) { var query = new SomeQuery(); // 无法编译 :-( p.Process(query); // 必须显式编写所有参数 p.Process<SomeQuery, string>(query); } }</code>
問題是,為什麼編譯器在這種情況下無法成功推斷泛型參數?
答案在於C#對泛型參數限制的處理方式。約束(例如TQuery : IQuery<TResult>
)限制了可用作參數的類型。但是,約束不被視為方法簽名的一部分,因此不能用於類型推斷。
在這種特定情況下,編譯器可以確定query
參數實現了IQuery<TResult>
,但它無法使用約束來推斷TResult
的具體類型。因此,它需要明確的類型參數。
在使用泛型時,了解C#類型推論的限制至關重要。雖然編譯器通常在推斷類型方面做得非常出色,但在某些情況下,約束會阻止它進行推斷。在這種情況下,需要提供具體的泛型參數來指導編譯器。
以上是為什麼 C# 不能推論具有介面約束的泛型類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!