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 ответов


использование именованных и необязательных аргументов влияет на разрешение перегрузки следующим образом:

  • метод, индексатор или конструктор является кандидатом на выполнение, если каждый из его параметров является необязательным или соответствует, по имени или по позиции, одному аргументу в вызывающей инструкции, и этот аргумент может быть преобразован в тип параметра.

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

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

http://msdn.microsoft.com/en-us/library/dd264739.aspx


необязательные параметры определяются в конце списка параметров после всех необходимых параметров. Если вызывающий объект предоставляет аргумент для любого из последовательности необязательных параметров, он должен предоставить аргументы для всех предыдущих необязательных параметров. Пробелы в списке аргументов, разделенные запятыми, не поддерживаются.

и

именованный аргумент может следовать аргументы, как показано здесь. CalculateBMI (123, рост: 64); Однако позиционный аргумент не может следуйте именованному аргументу. Следующая инструкция вызывает ошибку компилятора. // CalculateBMI (вес: 123, 64);