2010-09-10 3 views
3

Я пытаюсь сделать так:.net 4 строки [] значение параметра настройка по умолчанию

public int Insert(object o, string[] ignore = new string[] {"Id"}) 

, но он говорит мне, что я не могу сделать это? Почему это так?

+0

Опубликуйте ошибка компилятора пожалуйста :) – Spence

+0

@Spence он просто говорит мне, что это не разрешено для ссылочных типов для строки, за исключением, я немного удивлен, что это не было выполнено по какой-то причине – Omu

+2

«ошибка CS1736: значение параметра по умолчанию должно быть константой времени компиляции». И это ответ .. –

ответ

9

Проблема в том, что аргументы по умолчанию должны быть константами. Здесь вы динамически выделяете массив. Как и при объявлении переменных const, для ссылочных типов поддерживаются только строковые литералы и нули.

Вы можете достичь этого, используя следующий шаблон

public int Insert(object o, string[] ignore = null) 
{ 
    if (ignore == null) ignore = new string[] { "Id" }; 
    ... 
    return 0; 
} 

Теперь, когда вызывающий абонент исключает аргумент на месте вызова, компилятор будет передавать значение null, которые затем можно обрабатывать по мере необходимости. Обратите внимание, что jsut, чтобы сохранить его простым, я изменил значение аргумента в функции, не считая обычно хорошей практики, но я считаю, что в этом случае это может быть хорошо.

+0

да, я делаю Нравится это ignore = ignore ?? new [] {"Id"} ;, почему не удалось выполнить команду .net dev o_O – Omu

+0

@Omu, например, потому что это означает, что вы не можете использовать 'null' как реальное значение. Вы все равно можете сделать что-то подобное с перегрузкой. –

6

Единственным доступным значением по умолчанию для ссылочных типов является null (кроме строки, которая также принимает литералы), поскольку она должна быть доступна во время компиляции.

3

Самое простое решение сделать это в .NET 1.1 так:

public int Insert(object o) 
{ 
    return Insert(o, new String[] { "Id" }); 
} 


public int Insert(object o, String[] s) 
{ 
    // do stuff 
} 
+2

Его назвали перегрузкой ... – Spence

+0

@Spence, действительно, это ... – cjk

+1

На самом деле это C# 1 до 3.5 way ... :) – digEmAll

0

Поскольку это массив, почему бы не использовать params?

public int Insert(object o, params string[] ignore) 
{ 
    if (ignore == null || ignore.Length == 0) 
    { 
     ignore = new string[] { "Id" }; 
    } 
    ... 

Тогда вы можете назвать это так:

Insert(obj); 

Insert(obj, "str"); 

Insert(obj, "str1", "str2"); 
Смежные вопросы