2013-06-11 3 views
3

Мой код выглядит как этотне может использовать объект как тип параметра метода по умолчанию

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

компилятор говорит, что значение параметра по умолчанию для «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 
} 
+0

Я попробовал, что и тогда я имел две ошибки, одна из которых та же ошибка, я получаю, а другой говорит, что obj2 представляет объект типа. Значение параметра по умолчанию для ссылочного типа, отличного от строки, может быть инициализировано только нулевым значением. Я даже попробовал ojbect obj2 = (object) string.empty и evern object obj2 = (object) "". ничего не работает – Dimitri

+0

это ошибка, которую я получаю с кодом, который вы предложили. – Dimitri

+0

obj2 - тип объект.Значение параметра по умолчанию для ссылочного типа, отличного от строки, может быть инициализировано только нулем – Dimitri

4

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

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

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

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

+0

да, это, наверное, то, что я сделаю – Dimitri

+0

+1 Я думаю, что простая перегрузка - лучшее решение здесь –

1
static void SomeVoid(object obj1, object ojb2 = null) { 
    ojb2 = ojb2 ?? someDefaultValue; 

    // Do Something Here 
} 
+0

это идеальный помощник. Спасибо – Dimitri

+0

Я не думаю, что 'const object someDefaultValue = new Object()' будет компилироваться по той же причине: может только инициализировать константный ссылочный тип, отличный от 'string', до' null'. –

+0

yep. не будет компилироваться. удален. – radarbob

1

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

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

я бы просто пойти по:

static void SomeVoid(object obj1, object obj2 = null) 
{ 
    obj2 = obj2 ?? ""; 
    // rest 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^