為什麼在.NET 中無法推斷泛型方法的回傳類型
在.NET 中,泛型方法無法推斷其回傳類型。強制執行此限制是為了防止類型推斷在表達式中「雙向」流動,這可能導致可能的類型組合的組合爆炸。
範例
考慮以下泛型方法:
static TDest Gimme<TSource, TDest>(TSource source) { return default(TDest); }
如果允許回傳類型推斷,則以下程式碼將是valid:
string dest = Gimme(5);如果允許回傳類型推斷,則以下程式碼將是valid:如果允許回傳類型推斷,則以下程式碼將是valid:
但是,此程式碼會導致編譯器錯誤,因為無法從參數型別int 推斷出Gimme的回傳類型。
推理此限制背後的原因是為了防止類型資訊從表達式內部和外部流動的情況。考慮以下場景:
場景 1:多次重載假設我們有十個具有不同參數類型的方法 N 重載。如果我們允許泛型方法的回傳類型推斷,我們將需要推斷表達式 N(G(5)) 中 G 的回傳類型。這需要考慮 N 的所有十個重載並選擇“最佳”一個。然而,確定「最佳」重載的標準並不明確,從而導致潛在的歧義。
場景 2:條件式考慮表達式 double x = b ? G(5) : 123. 如果允許回傳類型推斷,我們需要根據條件表達式的型別(double)來決定 G 的回傳類型。但是,這並沒有考慮到 G 的傳回類型可能需要隱式轉換為條件表達式的參數類型 (int) 的可能性。
場景3:嵌套表達式如果我們組合多個條件表達式和方法調用,例如表達式N(N(b ? G(5) * G("hello") : 123)),傳回類型推斷的複雜度呈指數級增長。我們需要考慮 G 和 N 組合中所有可能的重載,從而導致可能的類型組合爆炸。
結論透過禁止泛型的回傳類型推斷方法,.NET 可以防止這些組合爆炸並確保類型推斷以可預測且一致的方式進行。以上是為什麼 .NET 無法推斷泛型方法中的回傳類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!