2013-07-10 41 views
1

我有一些功能,我可以實現使用方法重載/鏈,但我想知道如果我可以實現與可選參數相同的功能。下面是我想要實現的一個例子,下面是一個包含方法鏈接的版本(希望這會使我的意圖變得清晰)。這可以使用可選參數完成嗎?可選參數的默認值必須是靜態的嗎?

// what I would like to do 
private string CreateMessageFromTemplate(string templateId, Contact contact, string email = contact.emails.FirstOrDefault()) { ... } 

//what I know I can do  
private string CreateMessageFromTemplate(string templateId, Contact contact) 
{ 
    CreateMessageFromTemplate(templateId, contact, contact.emails.FirstOrDefault()); 
} 

private string CreateMessageFromTemplate(string templateId, Contact contact, string email) { ... } 

正如你所看到的,我得到從接觸參數的默認值(如果你不給我一個具體的電子郵件,我將只用在列表中的第一個)。可選參數的默認值是否必須是靜態的,或者它們可以是像我的例子中那樣的表達式的結果?如果可以,那麼正確的語法是什麼?

回答

8

參數的默認值必須是編譯時常量。什麼可以做,雖然是使默認爲空,然後將其設置在功能:

private string CreateMessageFromTemplate(string templateId, Contact contact, string email = null) 
{ 
    email = email ?? contact.emails.FirstOrDefault()) 
    ... 
} 
+0

我應該知道......只要我看了你的答案,我記得在C#中看到這個深入。冷卻時間結束時接受。 – evanmcdonnal