无法将对象用作方法的默认参数类型

Dim*_*tri 3 c# object default-parameters

我的代码看起来像这样

static void SomeVoid(object obj1, object ojb2 = someDefaultValue) {
    // Do Something Here
}
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*kiy 5

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

static void SomeVoid(object obj1, string ojb2 = "") {
    // Do Something Here
}
Run Code Online (Sandbox Code Playgroud)

编译器在抱怨,因为在编译过程中将在调用方法的位置提供默认参数值。即当你写

Foo.SomeVoid(42);
Run Code Online (Sandbox Code Playgroud)

它将编译成

Foo.SomeVoid(42, ""); 
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

    // Do Something Here
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*air 5

您可能只使用标准重载:

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

static void SomeVoid(object obj1, object ojb2) {
    // Do Something Here
}
Run Code Online (Sandbox Code Playgroud)

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