У меня есть класс Executive, а следующий код для этого класса.
public class Executive
{
public Executive(int ID=0)
{
//constructor 1
this.BaseSalary = 3000;
Console.Write("DONE");
}
public Executive()
{
//constructor 2
Console.Write("done");
}
}
И в основном я делаю следующее:
Executive exec = new Executive()
Он всегда вызывает конструктор2. почему он не вызывает конструктор1 (идентификатор имеет значение по умолчанию)?
То, как определяется лучший метод вызова, выполняется. Необязательные параметры без указанных значений удаляются из списка аргументов при выполнении разрешения перегрузки:
7.5.3.2 Лучший член функции
В целях определения лучшего члена функции стробируется список аргументов
A
содержащий только сами выражения аргументов в том порядке, в котором они отображаются в списке исходных аргументов. Списки параметров для каждого из членов функции-кандидата строятся следующим образом:• Расширенная форма используется, если член функции применим только в расширенной форме.
• Необязательные параметры без соответствующих аргументов удаляются из списка параметров
• Параметры переупорядочиваются так, чтобы они находились в той же позиции, что и соответствующий аргумент в списке аргументов.
Также в том же параграфе:
В случае, когда последовательности типов параметров
{P1, P2, …, PN}
и{Q1, Q2, …, QN}
эквивалентны (т.Pi
КаждыйPi
имеет преобразование идентичности в соответствующийQi
), применяются следующие правила tie-break, чтобы определить лучший член функции.• Если
MP
- не общий метод, аMQ
- общий метод,MP
лучше, чемMQ
.• В противном случае, если
MP
применим в своей нормальной форме, аMQ
имеет массив params и применим только в расширенной форме, MP лучше, чемMQ
.• В противном случае, если
MP
имеет более объявленные параметры, чемMQ
,MP
лучше, чемMQ
. Это может произойти, если оба метода имеют массивыparams
и применимы только в их расширенных формах.• В противном случае, если все параметры MP имеют соответствующий аргумент, тогда как аргументы по умолчанию должны быть заменены как минимум одним необязательным параметром в
MQ
тогдаMP
лучше, чемMQ
.
Это означает, что если у вас есть два метода, которые имеют применимые параметры, но нужно использовать необязательное значение параметра, а другое - нет, то один без дополнительного значения лучше.
Как указывает Марцин Юрашек, именно так он определил, какой конструктор следует назвать. Когда вы вызываете конструктор без параметров, он определяется как наилучший.
Решение вашей проблемы состояло бы в том, чтобы просто явно вызвать один конструктор из другого:
public class Executive
{
public Executive(int ID)
{
//constructor 1
this.BaseSalary = 3000;
Console.Write("DONE");
}
public Executive():this(0)
{
//constructor 2
Console.Write("done");
}
}