我的代码看起来像这样
static void SomeVoid(object obj1, object ojb2 = someDefaultValue) {
// Do Something Here
}
编译器说'obj2'的默认参数值必须是编译时常量。
我能做什么 ?在我的情况下,someDefaultValue为string.Empty
。
答案 0 :(得分:5)
将参数类型更改为string
,并改为使用空字符串:
static void SomeVoid(object obj1, string ojb2 = "") {
// Do Something Here
}
编译器抱怨,因为在编译调用方法时会提供默认参数值。即当你写作
Foo.SomeVoid(42);
它会编译成
Foo.SomeVoid(42, "");
这就是默认参数值应该是常量值的原因。参数类型也应该是string
,因为所有引用类型参数只能用null
常量初始化。 object
是参考类型。
有针对性的解决方法。您可以使用默认值object
的{{1}}类型参数,并在方法中手动处理该值:
null
答案 1 :(得分:4)
您可能只使用标准重载:
static void SomeVoid(object obj1) {
SomeVoid(obj1, String.Empty);
}
static void SomeVoid(object obj1, object ojb2) {
// Do Something Here
}
这也为您带来的好处是,如果您确定默认值不应为String.Empty
,则可以在不强制调用者重新编译以传递新的默认值的情况下进行更改。其他解决方案在调用或表现方式上存在细微的差异;我认为使用像这样的重载是确保完全相同行为的最佳方法。 (也就是说,如果obj2
假设是string
,我会完全接受@ lazyberezovsky的答案)
答案 2 :(得分:1)
static void SomeVoid(object obj1, object ojb2 = null) {
ojb2 = ojb2 ?? someDefaultValue;
// Do Something Here
}
答案 3 :(得分:1)
你做不到。错误消息清楚地描述:“除字符串之外的引用类型的默认参数值只能用null初始化”。
你也不能使用“”。
我只想过去:
static void SomeVoid(object obj1, object obj2 = null)
{
obj2 = obj2 ?? "";
// rest
}