在.NET 中定義泛型方法時,編譯器可能無法推斷回傳類型,即使輸入類型已知。發生這種情況是因為基本設計原則將類型資訊流限制為從內部表達式到最外層表達式的單一方向。
雙向類型推斷的含義
如果在泛型方法中推斷返回類型,則可能會出現複雜的情況,其中類型解析變得不明確且計算成本高昂。考慮以下範例:
// Multiple overloads for N with different argument types N(G(5)); // How many inferences should be made for R? // Conditional expression returning different types double x = b ? G(5) : 123; // Should R be inferred as int or double? // Nested function calls and overloads N(N(b ? G(5) : 123)); // Combinatorial explosion of possibilities to consider
在這些情況下,確定 G 的返回類型需要分析呼叫者的上下文並考慮多種場景,從而導致潛在的可能性組合爆炸。編譯器透過強制執行單向類型資訊流規則來避免這種複雜性。
Lambda 中的類型資訊流
與泛型方法相比,類型資訊流對於 lambda,在兩個方向上。此功能支援 LINQ 等功能,編譯器會考慮所有可能的重載和參數類型來解決重載問題。然而,當 lambda 的類型取決於周圍上下文時,重載解析的複雜性會顯著增加。
結論
限制泛型方法中的回傳類型推論是一項設計決策,簡化類型解析並防止潛在的組合爆炸。這項決定確保了 .NET 類型系統的效率和可預測性。雖然在某些情況下可能需要明確指定返回類型,但它最終會增強 .NET 應用程式的可靠性和效能。
以上是為什麼 C# 不推斷泛型方法中的回傳類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!