2012-09-04 58 views
1

爲什麼是這樣的工作:可選參數:編譯時間常數問題

public int DoesEmailAddressExistsExcludingEmailAddressID(
    string emailAddress, 
    string invitationCode, 
    int emailAddressID = 0, 
    int For = (int) Enums.FOR.AC) 

而其中AC是枚舉這並不

public int DoesEmailAddressExistsExcludingEmailAddressID(
    string emailAddress, 
    string invitationCode, 
    int emailAddressID = 0, 
    int For = Enums.FOR.AC.GetHashCode()) 

。運行時枚舉的哈希碼可以改變嗎?

+2

GetHashCode()需要執行代碼。這意味着它不是編譯時間常量。 –

+0

順便說一句,此問題的解決方案是使用傳統的C#重載方法,而不是使用默認參數。 – phoog

+0

我強烈建議不要使用'For'作爲變量名稱。第一個例子'as as'不會真正編譯。 –

回答

5

GetHashCode是一種方法。由於需要執行代碼來確定返回值,因此方法的返回值不是編譯時間常量。
無論方法是否返回總是相同的。

2

在程序運行期間,Enum的散列碼很可能保持不變。但是,在編譯時這不是保證。因此它不能是編譯時常量。

此外,正如丹尼爾已經提到的,必須執行GetHashCode才能確定值,這在編譯時顯然不能完成。

+0

+ +1:在實踐中,我們知道枚舉的哈希碼永遠是相同的,但*不能保證*,所以編譯器必須像處理其他方法一樣處理方法調用。 – phoog