Аргументы по умолчанию для структур

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

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 в источнике с любым оправданием, которое кто-то здесь дает.

Ответ 1

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

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

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

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

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

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

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

EDIT: если вы хотите по умолчанию использовать значение, отличное от точки (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);
    ...
}

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

Ответ 2

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