1

我創建了一個樣機類ilustrate問題:超載分辨率在通用構造

public class Anything<T> 
    { 
     /// <summary> 
     /// Generic typed constructor 
     /// </summary> 
     /// <param name="param1"></param> 
     public Anything(T param1) 
     { 
      Console.WriteLine("I'm generic typed constructor"); 
     } 

     /// <summary> 
     /// String typed constructor 
     /// </summary> 
     /// <param name="param1"></param> 
     public Anything(string param1) 
     { 
      Console.WriteLine("I'm string typed constructor"); 
     } 
    } 

請告訴我,如果我建字符串對象的什麼嗎?沒有辦法區分這兩個構造函數。使用相同數量的參數定義另一個構造函數是一種糟糕的做法嗎?

Two constructos looks equal

+0

其實有辦法。如果可能,編譯器將使用非泛型重載。所以,如果有關於字符串的特殊情況,這不是一個壞習慣 –

+0

你的問題到底是什麼?這是如何工作的(閱讀重載決議,看重複),哪一個會被調用(運行它)還是這是一個不好的做法(基於意見)?如果您提供真實的用例,則可以顯示替代方案。這個用例將解釋爲什麼你認爲你首先需要一個字符串重載,並從中解釋如何減少歧義。再次看到重複。 :) – CodeCaster

回答

1

編譯器總是選擇最具體的重載方法,這是一個在其簽名的string參數。即使你有一個通用的方法(或你的情況下的構造函數),明確鍵入的string參數是最具體的參數。因此

new Anything<string>("test"); 

將輸出

我字符串輸入構造


從軟件工程的角度來看,這的確是一個不好的做法,因爲它不會是清楚該類的用戶爲什麼例如具有string參數的構造函數會顯示與通用參數不同的行爲。