Передача значения по умолчанию в конструкторе

1

У меня есть класс 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 (идентификатор имеет значение по умолчанию)?

  • 2
    Вот как работает разрешение перегрузки метода. По правилам разрешения конструктор без параметров является «лучшей» перегрузкой, чем тот, для которого требуется значение по умолчанию.
  • 1
    См. Stackoverflow.com/questions/11585000/…
Показать ещё 1 комментарий
Теги:
constructor
overloading

2 ответа

3
Лучший ответ

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

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.

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

2

Как указывает Марцин Юрашек, именно так он определил, какой конструктор следует назвать. Когда вы вызываете конструктор без параметров, он определяется как наилучший.

Решение вашей проблемы состояло бы в том, чтобы просто явно вызвать один конструктор из другого:

 public class Executive
 {
    public Executive(int ID)
    {
        //constructor 1
        this.BaseSalary = 3000;
        Console.Write("DONE");
    }

    public Executive():this(0)
    {
        //constructor 2
        Console.Write("done");
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню