Я пытаюсь сделать так:.net 4 строки [] значение параметра настройка по умолчанию
public int Insert(object o, string[] ignore = new string[] {"Id"})
, но он говорит мне, что я не могу сделать это? Почему это так?
Я пытаюсь сделать так:.net 4 строки [] значение параметра настройка по умолчанию
public int Insert(object o, string[] ignore = new string[] {"Id"})
, но он говорит мне, что я не могу сделать это? Почему это так?
Проблема в том, что аргументы по умолчанию должны быть константами. Здесь вы динамически выделяете массив. Как и при объявлении переменных const
, для ссылочных типов поддерживаются только строковые литералы и нули.
Вы можете достичь этого, используя следующий шаблон
public int Insert(object o, string[] ignore = null)
{
if (ignore == null) ignore = new string[] { "Id" };
...
return 0;
}
Теперь, когда вызывающий абонент исключает аргумент на месте вызова, компилятор будет передавать значение null
, которые затем можно обрабатывать по мере необходимости. Обратите внимание, что jsut, чтобы сохранить его простым, я изменил значение аргумента в функции, не считая обычно хорошей практики, но я считаю, что в этом случае это может быть хорошо.
да, я делаю Нравится это ignore = ignore ?? new [] {"Id"} ;, почему не удалось выполнить команду .net dev o_O – Omu
@Omu, например, потому что это означает, что вы не можете использовать 'null' как реальное значение. Вы все равно можете сделать что-то подобное с перегрузкой. –
Единственным доступным значением по умолчанию для ссылочных типов является null (кроме строки, которая также принимает литералы), поскольку она должна быть доступна во время компиляции.
Самое простое решение сделать это в .NET 1.1 так:
public int Insert(object o)
{
return Insert(o, new String[] { "Id" });
}
public int Insert(object o, String[] s)
{
// do stuff
}
Поскольку это массив, почему бы не использовать 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");
Опубликуйте ошибка компилятора пожалуйста :) – Spence
@Spence он просто говорит мне, что это не разрешено для ссылочных типов для строки, за исключением, я немного удивлен, что это не было выполнено по какой-то причине – Omu
«ошибка CS1736: значение параметра по умолчанию должно быть константой времени компиляции». И это ответ .. –