2014-10-07 1631 views
6

編輯1:我知道有替代方法,如伸縮,這是一個純粹的教育問題。爲什麼默認的方法參數必須是C#編譯時常量

我知道這是真的,但爲什麼它一定是?這似乎是像這樣的東西:

public class Foo{ 

    private int bar; 

    public void SetBar(int baz = ThatOtherClass.GetBaz(3)){ 
     this.bar = baz; 
    } 

} 

編譯器可以在方法改變這樣的事情:

public void SetBar(int baz){ 

//if baz wasn't passed: 
baz = ThatOtherClass.GetBaz(3); 

this.bar = baz; 

} 

爲什麼不這項工作,或者將它,它只是一個設計決策?

+0

因爲在運行時值和編譯時值之間可能存在差異。如果編碼器需要編譯時間值「硬編碼」,那麼GetBaz()會在運行時返回完全不同的內容並引發程序出錯? – 2014-10-07 18:42:44

+5

如果您想知道爲什麼C#語言團隊沒有實現某個功能,請向他們詢問,而不是與語言創建無關的隨機開發人員。我們無法知道他們爲什麼選擇不實施此功能。 – Servy 2014-10-07 18:42:55

+1

你總是有方法重載的選項 – 2014-10-07 18:43:52

回答

7

由於規範說這樣:

固定參數具有默認參數的被稱爲可選 參數,而固定的參數不具有默認參數的是 所需的參數。在形式參數列表中的 可選參數後面可能不會出現所需的參數。參考或輸出參數 不能有默認參數。在默認參數的 表達式必須是下列之一:

•常數表達式

•()的形式新S的表達,其中S是一個值類型

•一個表達式默認(S)其中S是一個值類型

至於爲什麼語言設計者選擇這樣做,我們只能猜測。然而,另一片規範的暗示的答案:

當參數被從一個功能構件省略與對應 可選參數,該功能部件 聲明的默認參數隱式傳遞。因爲這些總是不變的,所以他們的評估不會影響其餘 論點的評估順序。

+0

是的,這是一個很好的觀點,如果您使用方法作爲默認值,那麼如果您有多個默認值並且在哪個時間點 – 2014-10-07 18:49:03

相關問題