C#: перегрузка конструкторов с необязательными параметрами и именованными аргументами?
Это не вопрос о правильной практике кодирования, я просто работаю через семантику. допустим, у меня есть следующие конструкторы...
public FooClass(string name = "theFoo")
{ fooName = name; }
public FooClass(string name, int num = 7, bool boo = true) : this(name)
{ fooNum = num; fooBool = boo; }
можно ли использовать именованные аргументы таким образом...?
FooClass foo1 = new FooClass(num:1);
/ / где я передаю только один именованный аргумент, полагаясь на optionals, чтобы позаботиться об остальном
или вызов конструктора FooClass (string, int, bool) без аргументов? то есть...
FooClass foo2 = new FooClass();
2 ответов
использование именованных и необязательных аргументов влияет на разрешение перегрузки следующим образом:
метод, индексатор или конструктор является кандидатом на выполнение, если каждый из его параметров является необязательным или соответствует, по имени или по позиции, одному аргументу в вызывающей инструкции, и этот аргумент может быть преобразован в тип параметра.
Если найдено более одного кандидата, правила разрешения перегрузки для предпочтительные преобразования применяются к аргументам, которые явно указаны. Опущенные аргументы для необязательных параметров игнорируются.
Если два кандидата считаются одинаково хорошими, предпочтение отдается кандидату, который не имеет необязательных параметров, для которых аргументы были опущены в вызове. Это является следствием общего предпочтения в разрешении перегрузки для кандидатов, у которых меньше параметры.
необязательные параметры определяются в конце списка параметров после всех необходимых параметров. Если вызывающий объект предоставляет аргумент для любого из последовательности необязательных параметров, он должен предоставить аргументы для всех предыдущих необязательных параметров. Пробелы в списке аргументов, разделенные запятыми, не поддерживаются.
и
именованный аргумент может следовать аргументы, как показано здесь. CalculateBMI (123, рост: 64); Однако позиционный аргумент не может следуйте именованному аргументу. Следующая инструкция вызывает ошибку компилятора. // CalculateBMI (вес: 123, 64);