Значение параметра OptionalAttribute по умолчанию? - PullRequest
16 голосов
/ 05 августа 2010

MSDN VS2010 Именованные и необязательные аргументы (Руководство по программированию в C #) рассказывает нам о необязательных параметрах в C #, показывая код, который я ожидал:

public void ExampleMethod(int required, 
    string optionalstr = "default string", 
    int optionalint = 10)

Хорошо, но также написано:

Вы также можете объявить необязательным параметры с помощью .NET Класс OptionalAttribute. Параметры OptionalAttribute не требуется значение по умолчанию.

Я прочитал Страница OptionalAttribute в MSDN и выполнил поиск в Интернете (на котором много людей, утверждающих, что параметры OptionalAttribute не могут быть использованы C # - я предполагаю, что эти комментарии были сделаны до C # 4?) , но я не могу найти ответ на два вопроса:

Если я использую OptionalAttribute для определения параметра C # как необязательного:

  1. какое значение будет использовано, если я вызову этот метод и не укажу значение этого параметра?
  2. будет ли это значение оцениваться во время компиляции или во время выполнения?

1 Ответ

12 голосов
/ 05 августа 2010

Правила таковы:

  • Для параметров типа object, Type.Missing.
  • Для других ссылочных типов передается null.
  • Для типов значений передается значение по умолчанию для типа значений .
    • Для Nullable<T> это означает, что вы получите экземпляр Nullable<T>, равный null (свойство HasValue вернет false)

Обратите внимание, что в случае всего, кроме параметров типа object, это эквивалент default(T).

Я был немного удивлен, поскольку в спецификации C # 4.0 не было указано, каким будет результат, и я ожидаю, что он будет там.

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

...