2012-09-14 64 views
5

我可以使用兩個相同的函數名稱,但參數相同但含義不同。函數過載

例如:

public void test(string name) 

public void test(string age) 

謝謝。

+0

當然,如果您要將'age'表示爲['TimeSpan'](http://msdn.microsoft.com/zh-cn/library/system.timespan.aspx),這不會是問題。 – Rawling

+0

@簡直就是,簡直就是任何形式的數字類型。 =) –

+0

有一個共同的參數,比如'string args' –

回答

4

不,你不能。簽名沒有區別 - 參數名稱無關緊要。

通過指定訪問級別(如public或private),可選修飾符(如抽象或密封),返回值,方法名稱和任何方法參數,在類或結構中聲明方法。這些部分一起是方法的簽名。

http://msdn.microsoft.com/en-us/library/ms173114.aspx

像其他幾個答案都表示,考慮你正在服用的數據類型。名稱確實是一個典型的字符串,但年齡必須是?如果你允許它是 - 例如 - int那麼你可以根據需要重載你的方法。

1

Signatures and Overloading

如果需要使用不同的意義的方法你爲什麼不創建一個不同的名稱的方法?在同一個對象上爲不同的事物使用相同的方法名稱會令人困惑。

3

不,您不能在返回類型或參數名稱上重載。與其他一些語言不同(最顯着的是,Objective C )參數名稱不是您函數簽名的一部分。

方法的簽名由方法的名稱,每個形式參數的類型和種類(值,引用或輸出)組成,按照從左到右的順序考慮。方法的簽名特別不包括返回類型,也不包括可能爲最右邊參數指定的參數修飾符。


甚至有它的不完全變成了選擇的部分參數名稱。

+0

+1,對Objective C – PeteH

2

您可以使用靜態方法和非靜態方法具有相同的名稱,但遵循與方法重載相同的規則的不同參數,但它們不能具有完全相同的簽名。

+0

有趣的見解......但這對於維護來說是一個壞主意! – PeteH

1

你可以混合在一起使用可選參數和默認值這些方法:

public void test(string name = null, string age = null) 
{ 
    if (name != null) 
    { 
    // Do something 
    } 
    else if (age != null) 
    { 
    // Do something else 
    } 
} 

而你可以調用這個方法類似:

test(name: "John"); 
test(age: "30"); 

不是很乾淨,但仍然可用。

0

否 - 編譯器拋出一個錯誤,因爲編譯器使用參數來確定調用哪個方法,而不是返回類型。

0

NO。

過載函數必須有不同的SIGNATURE。 即參數應該不同,無論是參數的數量還是不同數據類型參數的順序。