首頁 >後端開發 >C++ >為什麼 C# 泛型類型推斷因介面約束而失敗?

為什麼 C# 泛型類型推斷因介面約束而失敗?

DDD
DDD原創
2025-01-23 09:46:101059瀏覽

Why Does C# Generic Type Inference Fail with Interface Constraints?

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實例呼叫IQueryProcessorProcess方法時,編譯器無法推斷出正確的泛型參數。明確指定參數可以解決這個問題:

<code class="language-csharp">p.Process<SomeQuery, string>(query);</code>

推論失敗的原因

與最初的設想相反,僅靠約束不足以進行類型推論。 C#的類型推論完全基於參數及其對應的形式參數類型。由於提供的參數類型是SomeQuery(它實現了IQuery<string>),編譯器無法自動推斷泛型參數應為TQuery = SomeQueryTResult = string

Eric Lippert在文章「約束不是簽名的一部分」(https://www.php.cn/link/4cf06252cc21d496e754ad7185d0617d

以上是為什麼 C# 泛型類型推斷因介面約束而失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn