Перегружает ли его конструктор с необязательным параметром?

Вот пример кода:

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

Другие вопросы по тегам