Почему для необязательных параметров в С# 4.0 требуются константы времени компиляции?

Также есть способ использовать значения времени выполнения для необязательных параметров метода?

Ответ 1

Необязательные параметры должны быть константами, поскольку они записываются как значения атрибута. Следовательно, они наследуют все ограничения, которые имеет значение атрибута.

Невозможно напрямую кодировать значение времени выполнения. Однако вы можете приблизиться к следующему шаблону

public void MyApi(SomeType type = null) {
  type = type ?? new SomeType();
  ...
}

Ответ 2

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

И нет, вы не можете использовать значения времени выполнения в качестве необязательных параметров.

Ответ 3

Дополнительные параметры определяются во время компиляции и заменяются на метод, если вы вызываете метод с слишком небольшим количеством параметров. Они обрабатываются путем добавления атрибута к параметру в методе IL.

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