Перегружает ли его конструктор с необязательным параметром?
Вот пример кода:
public List(int capacity = defaultCapacity) {
items = new T[capacity];
}
В C# 5 Language Specification Section 1.6.7
написано:
Конструкторы экземпляров могут быть перегружены. Например, класс List объявляет два конструктора экземпляра, один из которых не имеет параметров, а другой принимает параметр int.
Но скомпилировано IL
для этого кода не содержит 2 конструкторов. Он содержит только эту декларацию:
.method public hidebysig specialname rtspecialname
instance void .ctor([opt] int32 capacity) cil managed
Это означает, что необязательный параметр CLR
уровень и определяется [opt]
,
После CLR
нет среды выполнения, которая может представлять этот объект с 2 перегруженными конструкторами.
Например, если я создаю 2 отдельных конструктора без скомпилированного необязательного параметра IL
будет содержать 2 .ctor
-s.
Я хочу уточнить, если языковая спецификация говорит, что class declares two instance constructors
не значит ли это, что скомпилировано IL
будет содержать 2 ctor
тоже.
1 ответ
Необязательные параметры, независимо от того, используются ли они в методах или конструкторах, не создают дополнительных перегрузок. Вместо этого необязательные параметры помечаются [opt], и всякий раз, когда вы вызываете его без указания этого параметра, это необязательное значение будет включено в ваш скомпилированный код.
Из-за этого, когда вы изменяете значение по умолчанию для необязательных параметров, вам нужно перекомпилировать все использования, чтобы это новое значение вводилось во все вызовы. Если вы этого не сделаете, будет использовано старое значение.
Обновить
Цитата из спецификации сбивает с толку. Если речь идет о List<T>
определенный в 1.6.7 только с одним конструктором, с необязательным параметром, чем это неправильно.