Невозможно использовать объект как тип параметра метода по умолчанию
Мой код выглядит так
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
}