设置C#可选参数的默认值

设置C#可选参数的默认值,c#,default-value,optional-parameters,C#,Default Value,Optional Parameters,每当我试图将可选参数的默认值设置为资源文件中的某个内容时,就会出现编译时错误 “message”的默认参数值必须是编译时常量 是否有任何方法可以更改资源文件的工作方式,使之成为可能 public void ValidationError(string fieldName, string message = ValidationMessages.ContactNotFound) 在这种情况下,ValidationMessages是一个资源

每当我试图将可选参数的默认值设置为资源文件中的某个内容时,就会出现编译时错误

“message”的默认参数值必须是编译时常量

是否有任何方法可以更改资源文件的工作方式,使之成为可能

public void ValidationError(string fieldName, 
                            string message = ValidationMessages.ContactNotFound)

在这种情况下,
ValidationMessages
是一个资源文件。

否,您将无法使资源在默认情况下直接工作。您需要做的是将默认值设置为null,然后在参数在方法体中具有默认值时执行资源查找。

一个选项是将默认值设置为null,然后适当填充:

public void ValidationError(string fieldName, string message = null)
{
    string realMessage = message ?? ValidationMessages.ContactNotFound;
    ...
}
当然,只有当您不想将
null
作为真实值时,这才有效


另一个可能的选择是有一个预构建步骤,根据资源创建一个满是
const
字符串的文件;然后可以引用这些常量。但这会相当尴尬。

另一种选择是将方法分成两部分,并让一个重载调用另一个,如下所示:

public void ValidationError(string fieldName)
{ 
    ValidationError(fieldName, ValidationMessages.ContactNotFound);
}

public void ValidationError(string fieldName, string message)
{
    ...
}

这种方法还允许您将
null
作为
message
的值传递,以防该值也是该参数的有效值。

这正是我所担心的。我真的很喜欢它告诉开发人员字符串将是什么的开发时间便利性:我意识到我所要求的(编译资源文件)扼杀了它存在的部分原因,但我使用它不是为了本地化和动态更改,而是作为重用字符串的公共存储。这是我害怕的。我真的很喜欢它告诉开发人员字符串将是什么的开发时间便利性:我意识到我所要求的(编译资源文件)扼杀了它存在的部分原因,但我使用它不是为了本地化和动态更改,而是作为重用字符串的公共存储。