Аргументы по умолчанию для структур - PullRequest
13 голосов
/ 20 апреля 2010

У меня есть функция, определенная так:

public static void ShowAbout(Point location, bool stripSystemAssemblies = false, bool reflectionOnly = false)

Это флаг CA1026 «Заменить метод ShowAbout на перегрузку, которая предоставляет все аргументы по умолчанию». Я не могу сделать Point location = new Point(0, 0) или Point location = Point.Empty, потому что они не являются константами времени компиляции и, следовательно, не могут быть значениями по умолчанию для этого аргумента функции. Таким образом, вопрос заключается в том, как определить значения аргументов по умолчанию для структур? Если это не может быть сделано, скорее всего я пойду на подавление CA1026 в источнике с любым оправданием, которое кто-то здесь дает.

Ответы [ 2 ]

24 голосов
/ 20 апреля 2010

Вы можете сделать это:

public static void ShowAbout(Point location = new Point(), 
    bool stripSystemAssemblies = false,
    bool reflectionOnly = false)

Из спецификации C # 4, раздел 10.6.1:

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

  • a константное выражение
  • выражение вида new S(), где S - тип значения
  • выражение вида default(S), где S - тип значения

Так что вы также можете использовать:

public static void ShowAbout(Point location = default(Point),
    bool stripSystemAssemblies = false,
    bool reflectionOnly = false)

РЕДАКТИРОВАТЬ: Если вы хотите установить значение по умолчанию другое , чем точка (0, 0), стоит знать о другом трюке:

public static void ShowAbout(Point? location = null
    bool stripSystemAssemblies = false,
    bool reflectionOnly = false)
{
    // Default to point (1, 1) instead.
    Point realLocation = location ?? new Point(1, 1);
    ...
}

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

1 голос
/ 20 апреля 2010

AFAICT CA1026 означает, что вы должны заменить его функциями, которые вообще не используют аргументы по умолчанию. Таким образом, изменение его, как показано, все равно вызовет нарушение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...