3

我的代码看起来像这样

static void SomeVoid(object obj1, object ojb2 = someDefaultValue) {
    // Do Something Here
}

编译器说“obj2”的默认参数值必须是编译时常量。我能做些什么 ?someDefaultValue 就string.Empty我而言。

4

4 回答 4

5

将参数类型更改为string,并改用空字符串:

static void SomeVoid(object obj1, string ojb2 = "") {
    // Do Something Here
}

编译器抱怨,因为默认参数值将在编译期间在调用您的方法的地方提供。即当你写

Foo.SomeVoid(42);

它会编译成

Foo.SomeVoid(42, ""); 

这就是为什么默认参数值应该是常量值的原因。参数类型也应该是string,因为所有引用类型参数只能用null常量初始化。并且object是引用类型。


有适合您的解决方法。您可以使用object具有默认值的类型参数null并在您的方法中手动处理该值:

static void SomeVoid(object obj1, object obj2 = null) {

    if (obj2 == null)
        // use default value

    // Do Something Here
}
于 2013-06-11T14:51:33.883 回答
4

您可能只使用标准重载:

static void SomeVoid(object obj1) {
    SomeVoid(obj1, String.Empty);
}

static void SomeVoid(object obj1, object ojb2) {
    // Do Something Here
}

这也给您带来的好处是,如果您决定默认值不应该是String.Empty,您可以更改它而不强制调用者重新编译以传递新的默认值。其他解决方案在调用或行为方式上存在细微差别。我认为使用这样的重载是确保完全相同的行为的最佳方法。(也就是说,如果应该obj2是a ,我会完全接受@lazyberezovsky 的回答)string

于 2013-06-11T14:56:29.550 回答
1
static void SomeVoid(object obj1, object ojb2 = null) {
    ojb2 = ojb2 ?? someDefaultValue;

    // Do Something Here
}
于 2013-06-11T14:57:08.917 回答
1

你不能这样做。错误信息描述得很清楚:“字符串以外的引用类型的默认参数值只能用null初始化”。

而且你也不能使用“”。

我会简单地通过:

static void SomeVoid(object obj1, object obj2 = null)
{
    obj2 = obj2 ?? "";
    // rest
}
于 2013-06-11T14:57:18.817 回答