在C#中,可以對泛型方法施加約束,以確保滿足特定要求。一種常見的限制是指定泛型類型必須具有無參數建構函數。然而,一個自然的問題出現了:我們能否對構造函數施加更具體的約束?
讓我們以問題中提供的範例為例,我們希望強制使用一個接受float[,]參數的建構子。最初的嘗試:
<code class="language-c#">public static T Method<T>(T a) where T : new(float[,] u) { //...do something... return new T(new float[0, 0]); }</code>
編譯失敗,迫使我們尋找替代方案。
為了規避此限制,我們採用了一種變通方法,即引入一個負責創建T型別實例的委託。此委託將必要的參數作為參數,並傳回T的實例。
<code class="language-c#">public static void Method<T>(T a, Func<float[,], T> creator) { //...do something... }</code>
修改我們的程式碼以使用此委託,結果如下:
<code class="language-c#">A.Method(float[,], instanceCreator); Func<float[,], T> instanceCreator = (float[,] arr) => new T(arr);</code>
此解決方案允許我們透過傳入適當的委託來對建構函式施加更複雜的約束。
以上是除了無參數建構函數之外,C# 泛型建構函數可以強制執行特定參數型別嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!