不能使用object作为方法的默认参数类型

本文关键字:默认 参数 类型 方法 object 不能 | 更新日期: 2023-09-27 18:17:57

我的代码是这样的

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

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

不能使用object作为方法的默认参数类型

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

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

Compiler正在报错,因为在调用方法的地方编译时会提供默认参数值。例如,当你写

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
}

您可以使用标准的重载:

static void SomeVoid(object obj1) {
    SomeVoid(obj1, String.Empty);
}
static void SomeVoid(object obj1, object ojb2) {
    // Do Something Here
}

这也给你带来了好处,如果你决定默认值不应该是String.Empty,你可以改变它,而不必强迫调用者重新编译来传递新的默认值。其他解决方案在如何调用或行为方面有微妙的差异;我认为使用像这样的过载是确保完全相同行为的最佳方法。(也就是说,如果obj2假设string,我完全同意@lazyberezovsky的答案)

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

也不能用"

我会简单地通过:

static void SomeVoid(object obj1, object obj2 = null)
{
    obj2 = obj2 ?? "";
    // rest
}
static void SomeVoid(object obj1, object ojb2 = null) {
    ojb2 = ojb2 ?? someDefaultValue;
    // Do Something Here
}