C# 可选参数的默认值必须是静态的吗?

C# 可选参数的默认值必须是静态的吗?,c#,.net,C#,.net,我有一些可以使用方法重载/链接实现的功能,但我想知道是否可以使用可选参数实现相同的功能。下面是我想要实现的一个例子,下面是一个带有方法链接的版本,希望它能让我的意图更加清晰。这可以使用可选参数来完成吗 // what I would like to do private string CreateMessageFromTemplate(string templateId, Contact contact, string email = contact.emails.FirstOrDefault(

我有一些可以使用方法重载/链接实现的功能,但我想知道是否可以使用可选参数实现相同的功能。下面是我想要实现的一个例子,下面是一个带有方法链接的版本,希望它能让我的意图更加清晰。这可以使用可选参数来完成吗

// 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) { ... }

如您所见,我从contact参数中导出默认值,如果您没有给我一封特定的电子邮件,我将使用列表中的第一封。可选参数的默认值必须是静态的还是像我的示例中那样的表达式的结果?如果可以,正确的语法是什么?

参数的默认值必须是编译时常量。但是,您可以做的是将默认值设为null,然后在函数中设置它:

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

参数的默认值必须是编译时常量。但是,您可以做的是将默认值设为null,然后在函数中设置它:

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

我应该知道。。。当我读到你的答案时,我记得我在C中深入地看到了这一点。当冷却结束时接受我应该知道。。。当我读到你的答案时,我记得我在C中深入地看到了这一点。冷却结束时接受。