C# 為何構造函數無法繼承泛型方法的型別推論?
在 C# 中,建構子缺乏泛型方法所擁有的型別推斷能力。例如,在以下程式碼中:
<code class="language-csharp">public class MyType<T> { private readonly T field; public MyType(T value) { field = value; } } var obj = new MyType(42); // 期望类型:MyType<int></code>
編譯器無法推論 obj
的型別是 MyType<int>
。一種解決方法是使用工廠類別:
<code class="language-csharp">public class MyTypeFactory { public static MyType<T> Create<T>(T value) { return new MyType<T>(value); } } var myObj = MyTypeFactory.Create(42);</code>
這引發了對這種限制背後原因的疑問。
是否存在根本原因?
並沒有決定性的根本原因阻止建構子進行型別推論。相反,識別所有相關類型並在具有不同參數個數的構造函數之間解析重載需要一個複雜的演算法。此外,為了確保向後相容性,非泛型建構函數優先於推斷出的建構子。
實際障礙:權衡利弊
儘管建構函式中的型別推論具有淨收益,但這並不一定保證其實現。一項功能的可行性取決於其與其他潛在改進、資源分配和相容性問題的相對價值。
工廠模式:巧妙的替代方案
工廠方法模式為缺乏建構函式類型推論提供了一種有效的解決方法。透過引入額外的抽象層,類型推斷可以應用於工廠方法,從而在不修改構造函數本身的情況下達到類似的結果。
從未實現的變更
儘管在 C# 6 中考慮過實現,但該提議的功能最終從最終設計中刪除。它接近被採用的事實突顯了其潛在的實用性,但最終,其他優先事項佔了上風。
以上是為什麼 C# 建構子不能從泛型方法繼承型別推斷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!