Невозможно использовать объект как тип параметра метода по умолчанию

Мой код выглядит так

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

компилятор говорит, что значение параметра Default для 'obj2' должно быть константой времени компиляции. А что я могу сделать? someDefaultValue является string.Empty в моем случае.

4 ответа

Решение

Изменить тип параметра на 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
}

Вы можете просто использовать стандартную перегрузку:

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

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

Это также дает вам преимущество, если вы решите, что значение по умолчанию не должно быть String.Emptyвы можете изменить его, не заставляя абонентов перекомпилировать, чтобы передать новое значение по умолчанию. Другие решения имеют тонкие различия в том, как они называются или ведут себя; Я думаю, что использование такой перегрузки - лучший способ обеспечить точно такое же поведение. (что сказал, если obj2 должен быть stringЯ бы полностью согласился с ответом @lazyberezovsky)

Тебе этого не сделать. Сообщение об ошибке ясно описывает: "Значение параметра по умолчанию для ссылочного типа, отличного от строки, может быть инициализировано только с нулевым значением".

И вы не можете использовать "" либо.

Я бы просто прошел мимо:

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
}
Другие вопросы по тегам