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

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


person Joan Venge    schedule 18.03.2011    source источник


Ответы (3)


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

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

public void MyApi(SomeType type = null) {
  type = type ?? new SomeType();
  ...
}
person JaredPar    schedule 18.03.2011
comment
Спасибо, это похоже на ловкий трюк. Из любопытства, знаете ли вы, почему они реализованы с использованием атрибутов? Я предполагаю повторно использовать то, что уже есть в структуре? - person Joan Venge; 18.03.2011
comment
@Joan IIRC это делается с атрибутами, потому что так делают другие языки (VB.Net) и, следовательно, обеспечивает с ними совместимость. - person JaredPar; 18.03.2011
comment
@Joan: Используя атрибуты, они не нарушают языки, в которых нет этой функции. Помните, что все в .NET компилируется в форму, которая должна быть нейтральной к языку... Атрибуты — это простой способ обработки необязательных параметров на определенном языке, не требующий серьезных изменений в других языках .NET. - person Reed Copsey; 18.03.2011
comment
@Jared: Спасибо, но теперь я понимаю, если показанный вами трюк не будет работать для типов значений или ссылочных типов, где вы законно хотите передать значение null, верно? - person Joan Venge; 18.03.2011
comment
@Reed: Спасибо, это хороший момент. Но если бы это была расширенная функция IL, не сломается ли она для других языков? Например, сказать что-то еще, что только C # выводит в IL? - person Joan Venge; 18.03.2011
comment
@Joan: Это потребует изменения CLR только для поддержки этой функции - то, как они это сделали, соответствует существующей реализации VB, не влияет на другие языки и просто работает ... - person Reed Copsey; 18.03.2011
comment
Да, это то, что я имел в виду. В этом есть смысл. Тогда они просто пошли по самому простому пути. - person Joan Venge; 18.03.2011

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

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

person Andrew Hare    schedule 18.03.2011
comment
Спасибо, но разве он не может скомпилироваться со ссылкой на ссылку во время выполнения? Итак, скажите что-нибудь вроде: this.Filename и т. д. в одном классе? - person Joan Venge; 18.03.2011

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

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

person Reed Copsey    schedule 18.03.2011